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

[高频题] 【面试新题】绝妙的二分查找题,一定要练习一下

   
🔗
JoyForce 2019-5-24 01:47:28 | 只看该作者
全局:
感谢楼主分享,非常好的一道题。我想了一下,这个题是不是可以反过来问,给定一个number,给出它在missing的序列里排第几,比如输入一个5,返回2
下面是我的解法:
  1.         static int KthMissNumber(int[] nums, int value)
  2.         {
  3.             int left = 0, right = nums.Length;
  4.             while (left < right)
  5.             {
  6.                 int mid = (left + right) / 2;
  7.                 if (nums[mid] > value)
  8.                 {
  9.                     right = mid;
  10.                 }
  11.                 else if (nums[mid] < value)
  12.                 {
  13.                     left = mid + 1;
  14.                 }
  15.                 else
  16.                 {
  17.                     return mid;
  18.                 }
  19.             }

  20.             if (nums[left] < value)
  21.             {
  22.                 return nums[left] - nums[0] - left + 1;
  23.             }
  24.             else
  25.             {
  26.                 return nums[left-1] - nums[0] - left + 2;
  27.             }
  28.         }
  29.     }
复制代码

补充内容 (2019-5-24 01:49):
这里有个假设是value一定是missing number,所以return mid;那一行永远不会执行
回复

使用道具 举报

🔗
codeyy 2019-11-14 03:09:40 | 只看该作者
全局:
  1. // Basic Ideas: binary search
  2. // Complexity: Time O(log(n)), Space O(1)
  3. func missingElement(nums []int, k int) int {
  4.     totalMiss := (nums[len(nums)-1]-nums[0]+1)-len(nums)
  5.     if totalMiss < k {
  6.         return nums[len(nums)-1]+k-totalMiss
  7.     }
  8.     left, right := 0, len(nums)-1
  9.     for left+1<right {
  10.         mid := (right-left)/2+left
  11.         cnt := (nums[mid]-nums[left])-(mid-left)
  12.         if cnt >= k {
  13.             // search left part
  14.             right = mid
  15.         } else {
  16.             // search right part
  17.             left = mid
  18.             k -= cnt
  19.         }
  20.     }
  21.     // left.right
  22.     return nums[left]+k
  23. }
复制代码

评分

参与人数 2大米 +3 收起 理由
九道 + 1 给你点个赞!
dennyzhang007 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
Shilcare 2019-11-14 23:42:03 | 只看该作者
全局:
类似蠡口妖灵遛凌, 只是missing的不会超过原数组的最大值

回复

使用道具 举报

🔗
zzgzzm 2020-1-6 11:49:31 | 只看该作者
全局:
My solution in C++
  1. // number of missing integers in range nums[start, end]
  2. int numMissing(vector<int>& nums, int start, int end) {
  3.   return (nums[end]-nums[start]) - (end - start);
  4. }

  5. int getKthMissing(vector<int>& nums, int k) {
  6.   int n = nums.size();
  7.   
  8.   // validate k
  9.   if (k <= 0 || numMissing(nums, 0, n-1) < k) return INT_MIN;
  10.   
  11.   int L = 0, R = n-1;
  12.   while (R-L > 1) {
  13.     int mid = (L+R)/2;
  14.     int missing = numMissing(nums, L, mid);
  15.     if (missing >= k) R = mid;
  16.     else {
  17.       L = mid;
  18.       k -= missing;
  19.     }
  20.   }
  21.   
  22.   return nums[L] + k;
  23. }
复制代码
回复

使用道具 举报

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

本版积分规则

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