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

FB新鲜出炉的电面

🔗
laonawuli 2016-6-5 11:52:37 | 只看该作者
全局:
zzz1322 发表于 2016-6-4 19:46
没有。一个二维平面上,给定N个点,求离原点最近的前K个点。

所以跟 LC的 215. Kth Largest Element in an Array   很像
回复

使用道具 举报

🔗
 楼主| zzz1322 2016-6-5 11:53:46 | 只看该作者
全局:
laonawuli 发表于 2016-6-5 11:44
另外decode ways 是和LC上完全相同的返回所有可能性的数量int, 还是说返回所有结果List?

和LC完全相同
回复

使用道具 举报

🔗
 楼主| zzz1322 2016-6-5 11:54:38 | 只看该作者
全局:
laonawuli 发表于 2016-6-5 11:52
所以跟 LC的 215. Kth Largest Element in an Array   很像

是的,很相似。不过O(n)的做法不太好写,边界很容易写错
回复

使用道具 举报

🔗
laonawuli 2016-6-5 11:57:53 | 只看该作者
全局:
zzz1322 发表于 2016-6-4 19:54
是的,很相似。不过O(n)的做法不太好写,边界很容易写错

卧槽这题怎么O(n)? 不应该是 nLogn么

补充内容 (2016-6-4 19:58):
说错  nLogK
回复

使用道具 举报

🔗
blackrose 2016-6-5 12:00:47 | 只看该作者
全局:
laonawuli 发表于 2016-6-5 11:57
卧槽这题怎么O(n)? 不应该是 nLogn么

补充内容 (2016-6-4 19:58):

估计楼主说错了,heap 的 time complexity 和 quick select一样。。。。
回复

使用道具 举报

🔗
 楼主| zzz1322 2016-6-5 12:03:50 | 只看该作者
全局:
laonawuli 发表于 2016-6-5 11:57
卧槽这题怎么O(n)? 不应该是 nLogn么

补充内容 (2016-6-4 19:58):

nlogk是用堆的,O(n)的是用快排的partition。每次随机抽取一个元素,把数组分为小于这个元素和大于这个元素的两个部分,这样,由于是随机的抽取的,期望就是把数组平均分成两半,所以T(n) = T(n / 2) + O(n)。根据主定理,T(n) = O(n)。可以参考一下我LC这道题的代码。
  1. import java.util.Random;

  2. public class Solution {
  3.    
  4.     Random r = new Random();
  5.    
  6.     private void swap(int[] nums, int i, int j) {
  7.         int t = nums[i];
  8.         nums[i] = nums[j];
  9.         nums[j] = t;
  10.     }
  11.    
  12.     private int kth(int[] nums, int left, int right, int k) {
  13.         int i = left, n = right;
  14.         int mid = r.nextInt(right - left + 1) + left;
  15.         int pivot = nums[mid];
  16.         for(int j = left; j <= n;) {
  17.             if(nums[j] > pivot) swap(nums, i++, j++);
  18.             else if(nums[j] < pivot) swap(nums, j, n--);
  19.             else ++j;
  20.         }
  21.         if(k + left < i) return kth(nums, left, i - 1, k);
  22.         else if(k + left <= n) return nums[k + left];
  23.         else return kth(nums, n + 1, right, k - (n - left + 1));
  24.     }
  25.    
  26.     public int findKthLargest(int[] nums, int k) {
  27.         return kth(nums, 0, nums.length - 1, k - 1);
  28.     }
  29. }
复制代码
回复

使用道具 举报

🔗
laonawuli 2016-6-5 12:12:58 | 只看该作者
全局:
zzz1322 发表于 2016-6-4 20:03
nlogk是用堆的,O(n)的是用快排的partition。每次随机抽取一个元素,把数组分为小于这个元素和大于这个元 ...

确实比heap复杂多了。你当时用的heap还是partition?另外为毛给你搞了两轮电面。。。

补充内容 (2016-6-4 20:14):
看到你上面说了用heap了
回复

使用道具 举报

🔗
blackrose 2016-6-5 12:13:40 | 只看该作者
全局:
zzz1322 发表于 2016-6-5 12:03
nlogk是用堆的,O(n)的是用快排的partition。每次随机抽取一个元素,把数组分为小于这个元素和大于这个元 ...

Parition 是N time 吧, 因为可以recursion,所以是nlgn, 堆的话,先push进去所有元素 nlgn time,再找kth KnLgn 吧。。。怎么突然感觉这么凌乱
回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
jq2017 2016-6-5 18:00:24 | 只看该作者
全局:
zzz1322 发表于 2016-6-5 11:50
一个pointer不是最佳的方案。我说了这个方案,貌似小哥很不满意,问我有没有其他的方案,我想了半天没想 ...

这道题不就是Move zeroes么,为什么你的test case是这个结果...
回复

使用道具 举报

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

本版积分规则

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