📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
楼主: HappyBirdy
跳转到指定楼层
上一主题 下一主题
收起左侧

亚麻 Amazon OA 社招 新题详解

   
全局:
谢谢分享!!
回复

使用道具 举报

🔗
woridage1 2019-7-19 09:20:15 | 只看该作者
全局:
没太意会楼主的坑,我想到办法,一开始先假定N个城市是N个岛,然后根据已经有的道路进行合并,算算剩下多少个孤岛。然后用sort好的新路进行连接,连接一次孤岛减一次,孤岛为1的时候返回。如果所有新路都查完,孤岛数大于1则失败。这个方法可以吗
回复

使用道具 举报

🔗
sophie729 2019-7-21 02:27:46 | 只看该作者
全局:
楼主后来去amz 了么?
回复

使用道具 举报

🔗
JimmyXLLC 2019-7-24 05:06:51 | 只看该作者
全局:
附上我的c++ 解

  1. class unionfind {
  2. public:
  3.         unionfind(int size) {
  4.                 p = vector<int>(size, -1);
  5.         }

  6.         int find(int x) {
  7.                 if (p[x] == -1)
  8.                         return x;
  9.                 return find(p[x]);
  10.         }

  11.         void make_union(int x, int y) {
  12.                 int xp = find(x);
  13.                 int yp = find(y);

  14.                 if (xp != yp)
  15.                         p[xp] = yp;

  16.         }

  17.         vector<int> p;
  18. };

  19. struct compare {
  20.         bool operator() (vector<int> a, vector<int> b) {
  21.                 return a[2] > b[2];
  22.         }
  23. };

  24. int mst_min_cost(int n, int oldr, vector<vector<int>> &roads, vector<vector<int>> &newroad) {
  25.         class unionfind uf(n+1);
  26.         for (auto & it : roads)
  27.                 uf.make_union(it[0], it[1]);

  28.         priority_queue<vector<int>, vector<vector<int>>, compare> q;//min heap, min cost at top
  29.         for (auto & it : newroad)
  30.                 q.push(it);

  31.         int res_cost = 0;
  32.         while (!q.empty()) {
  33.                 vector<int> cur = q.top();
  34.                 q.pop();

  35.                 int p1 = uf.find(cur[0]);
  36.                 int p2 = uf.find(cur[1]);
  37.                 if (p1 != p2) {
  38.                         uf.make_union(p1, p2);
  39.                         res_cost += cur[2];
  40.                 }
  41.         }

  42.         for (int i = 2; i<n+1;i++) { // check connected components > 1
  43.                 if (uf.find(i) != uf.find(i-1))
  44.                         return -1;
  45.         }

  46.         return res_cost;
  47. }
复制代码
回复

使用道具 举报

🔗
flyingsky211 2019-7-26 12:19:11 | 只看该作者
全局:
很有用的信息!
回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
Zoeyfeng 2019-8-15 12:00:49 | 只看该作者
全局:
这题的坑不应该是roadsAvailable list里面有环吗?
回复

使用道具 举报

🔗
honghongm 2019-9-3 04:20:41 | 只看该作者
全局:
必须点赞加大米
回复

使用道具 举报

🔗
Dr.Octopus 2019-9-25 09:09:31 | 只看该作者
全局:
第二题c++代码,欢迎讨论:
  1. #include <iostream>
  2. #include <queue>
  3. #include <algorithm>

  4. class Solution {
  5.         int n;
  6.         int *parent;

  7.         void union(int x, int y){
  8.                 int px=find(x);
  9.                 int py=find(y);
  10.                 if(px != py){
  11.                         parent[px]=py;
  12.                         n--;
  13.                 }
  14.         }
  15.         int find(int x){
  16.                 if(parent[x] == x){
  17.                         return parent[x];
  18.                 }
  19.                 return find(parent[x]);
  20.         }

  21. public:
  22.         getMinimumCostToConstruct(int numTotalAvailableCities, int numTotalAvailableRoads,
  23.                 vector<vector<int>> roadsAvailable, int numNewRoadsConstruct, vector<vector<int>> costNewRoadsConstruct){
  24.                 // corner case
  25.                 if(numTotalAvailableCities < 2 || numTotalAvailableRoads >= numTotalAvailableCities-1){
  26.                         return 0;
  27.                 }
  28.                 int n=numTotalAvailableCities;
  29.                 parent=new int[n+1];
  30.                 for(int i=0; i<n+1; i++){
  31.                         parent[i]=i;
  32.                 }
  33.                 int existingRoadCount = 0;
  34.                 int cost=0;
  35.                 sort(roadsAvailable.begin(), roadsAvailable.end(), [](vector<int> a, vector<int> b){
  36.                         return a[2]<b[2];
  37.                 });
  38.                 for(vector<int> pair: roadsAvailable) {
  39.                         int x= pair[0];
  40.                         int y= pair[1];
  41.                         if(find(x) != find(y)){
  42.                                 union(x, y);
  43.                         }
  44.                 }

  45.                 for(auto it: costNewRoadsConstruct){
  46.                         int x= it[0];
  47.                         int y= it[1];
  48.                         if(find(x) != find(y)){
  49.                                 union(x, y);
  50.                                 cost += it[2];
  51.                         }
  52.                 }
  53.                 return n==1? cost: -1;
  54.         }
  55. };
复制代码

补充内容 (2019-9-25 11:28):
函数名 void union(int x, int y) 应该改为 void unionFind(int x, int y){}, 不然就重复关键字了。
回复

使用道具 举报

🔗
jan2019 2019-10-5 01:14:39 | 只看该作者
全局:
楼主好人,还帮着想怎么节省大米下载资料。看了unionfind的写法,应该是参照的princeton algorithm的quick union的写法吧?简介明了。赞。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表