楼主: alfredaria
跳转到指定楼层
上一主题 下一主题
收起左侧

Facebook Menlo Part University Day

🔗
whitney94 2016-10-30 06:11:27 | 只看该作者
全局:
多谢楼主分享!能问一下楼主第一轮第二题task with k cooldown的那个followup,怎么用linkedhashmap啊,为什么这样会optimize storage呢?谢谢了
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 06:29:34 | 只看该作者
全局:
alfredaria 发表于 2016-10-28 07:23
我当时问能否改原来的matrix,答曰可以,所以就不需要额外空间了吧。我的做法是用两个ArrayList队列维护 ...

这个做法的确很好,因为对于unweighted graph来说第K次做BFS的点就是距离为K的点,这样就不用保持一个distance of locations 的2D 数组最后还得找最大的所有值。 :-)
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 06:34:36 | 只看该作者
全局:
jfree811 发表于 2016-10-29 08:04
求教楼主一个情况呀
O X O O
O X O O

应该只是输出(0, 3) (min dist = 3). 是指到最近的knight的距离,不能只看被拦住的某一个。

一个点的距离是无穷的话必须是所有的knights都无法到达该点。
回复

使用道具 举报

🔗
eko910817 2016-10-30 07:11:03 | 只看该作者
全局:
第一题可以理解成是Shortest Distance from All Buildings的变种么
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 09:11:51 | 只看该作者
全局:
whitney94 发表于 2016-10-30 06:11
多谢楼主分享!能问一下楼主第一轮第二题task with k cooldown的那个followup,怎么用linkedhashmap啊,为 ...

这个题时间是O(N) (N为tasks总数)。如果只用一个unordered_map<int,int> lastTime来记录一个task最后一次执行的时间的话那么最差空间就是O(N)。但是随着时间推移,当一个task最后一次执行时间早于currentTime - k的时候就没有必要保存了,因为从currentTime 起反正cool down时间都已经过了,所以其实保存lastTime中最新的k个就足够了。这样空间消耗就从O(N)降到了O(min(N,k))。但是unordered_map是没有顺序概念的,所以在C++中就再配合使用一个list<int> prevTasks来按时间顺序记录最近执行过的k个task ids.注意list是node based container,所以再删除第一个元素时的操作pop_front()是O(1)的,这个很重要,保持整体算法时间还是O(N)的。
我对Java不熟,估计linkedhaskmap在Java中是类似的意思。
  1. int TimeConsumption(vector<int>& tasks, int k) {
  2.   if (k <= 0) return tasks.size(); // no cool down needed
  3.   // store info only within last k time stamps
  4.   unordered_map<int,int> lastTime; // task id->last executed time stamp
  5.   list<int> prevTasks; // previous task ids ordered in time
  6.   int curTime = 1; // current time stamp
  7.   
  8.   for (int t : tasks) {
  9.     // remove oldest task if older than curTime - k  
  10.     if (!prevTasks.empty() && lastTime[*prevTasks.begin()] < curTime - k)
  11.     { lastTime.erase(*prevTasks.begin()); prevTasks.pop_front(); }
  12.    
  13.     // t is not executed within last k time stamps
  14.     if (!lastTime.count(t)) {
  15.         lastTime[t] = curTime++;
  16.         prevTasks.push_back(t);
  17.     }
  18.     // t is executed within last k time stamps
  19.     else {
  20.         lastTime[t] += (k+1);
  21.         curTime = lastTime[t];
  22.     }
  23.   }
  24.   return curTime;
  25. }
复制代码

补充内容 (2016-10-30 09:20):
Sorry. 以上算法在else case "// t is executed within last k time stamps"时没有将task t从list中移到尾端。我在下面补上正确的算法
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 09:42:50 | 只看该作者
全局:
更正25层算法:当当前task need cool down时,需要将当前task从list移到尾部,所以需要在unordered_map中有list::iterator的位置。将lastTime改为从task到pair(last time, list::iterator)。
  1. int TimeConsumption(vector<int>& tasks, int k) {
  2.   if (k <= 0) return tasks.size(); // no cool down needed
  3.   // store info only within last k time stamps
  4.   // task id->(last executed time stamp, list position)
  5.   unordered_map<int,pair<int,list<int>::iterator>> lastTime;
  6.   list<int> prevTasks; // previous task ids ordered in time
  7.   int curTime = 0; // current time stamp
  8.   
  9.   for (int t : tasks) {
  10.     curTime++;
  11.    
  12.     // remove oldest task if older than curTime - k  
  13.     if (!prevTasks.empty() && lastTime[*prevTasks.begin()].first < curTime - k)
  14.     { lastTime.erase(*prevTasks.begin()); prevTasks.pop_front(); }
  15.    
  16.     // if executed within last k time stamps
  17.     if (lastTime.count(t)) {
  18.       prevTasks.erase(lastTime[t].second);
  19.       curTime = lastTime[t].first + k + 1; // need cool down
  20.     }
  21.     // make most recently executed task
  22.     prevTasks.push_back(t);
  23.     lastTime[t] = make_pair(curTime, --prevTasks.end());
  24.   }
  25.   return curTime;
  26. }
复制代码
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 10:07:16 | 只看该作者
全局:
eko910817 发表于 2016-10-30 07:11
第一题可以理解成是Shortest Distance from All Buildings的变种么

我不知道"Shortest Distance from All Buildings"是指"Shortest Distance from the nearest Building"的意思吗?如果是的话那么就是变种了,就是求所有location的shortest distance, 然后在所有shortest distance再求所有最大的。
回复

使用道具 举报

🔗
eko910817 2016-10-30 10:30:12 | 只看该作者
全局:
zzgzzm 发表于 2016-10-29 18:07
我不知道"Shortest Distance from All Buildings"是指"Shortest Distance from the nearest Building"的 ...

谢谢回复。想再确认一下,意思是针对每一个O,只是算离它最近的K的那个距离,而不是算这个O到所有K的距离和是吗?leetcode那道题Shortest Distance from All buildings是算每一个点到所有building的距离和最短。
回复

使用道具 举报

🔗
eko910817 2016-10-30 10:59:34 | 只看该作者
全局:
zzgzzm 发表于 2016-10-29 17:42
更正25层算法:当当前task need cool down时,需要将当前task从list移到尾部,所以需要在unordered_map中有 ...

有个疑问。用了list是不是增加了space complexity?虽然的确删掉了map里面的一些不必要数据,但是又新增了一个list
回复

使用道具 举报

🔗
zzgzzm 2016-10-30 12:27:02 | 只看该作者
全局:
eko910817 发表于 2016-10-30 10:59
有个疑问。用了list是不是增加了space complexity?虽然的确删掉了map里面的一些不必要数据,但是又新增了 ...

这里新加的list的长度至多k, 同时将原来可能长为N的hashmap 也减到长度至多也是k. 这就等于是用空间C*min(N,k) 来换取N,其中C为常数。在论asymptotic 意义下的复杂度来说,C*min(N,k)是肯定划算的,因为复杂度都是在N非常巨大的情况下讨论才有意义。
回复

使用道具 举报

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

本版积分规则

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