查看: 2721| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] lc702, 二分法while(left+1<right)就不行?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
大佬们好,
这道题是search in a sorted unknown size array, 前面都写的好好的,就是后面二分法的时候program crash掉了
而且这个也不好写进IDE debug,
邪了门了,只要leetcode 题里带有interface的我全都做不对,
这里的的话,我按照往常的写法判断二分法的条件while(left+1<right)就不行,而while(left<=right)的写法就可以,
请问为什么?实在想不出,求大佬指出【lc中的ArrayReader.get(k)是这里的dict,get(k)】
  1. public class Solution {
  2.   public int search(Dictionary dict, int target) {
  3.     int left=0, right=1;
  4.     while(dict.get(right)!=null && dict.get(right)<target){
  5.       left=right;
  6.       right=2*right;
  7.     }
  8.     return binarySearch(dict,target, left,right);
  9.   }

  10.   private int binarySearch(Dictionary dict, int target, int left, int right){
  11.     //Here do classical binary search,works
  12.     // while(left<=right){
  13.     //   int mid=left+(right-left)/2;
  14.     //   if(dict.get(mid)==null || dict.get(mid)>target){
  15.     //     right=mid-1;
  16.     //   }else if(dict.get(mid)<target){
  17.     //     left=mid+1;
  18.     //   }else{
  19.     //     return mid;
  20.     //   }
  21.     // }
  22.     // 并不知道为啥用变种做法就不可以
  23.     while(left+1<right){
  24.       int mid=left+(right-left)/2;
  25.       if(dict.get(mid)==null || dict.get(mid)>target){
  26.         right=mid;
  27.       }else if(dict.get(mid)<target){
  28.         left=mid;
  29.       }else{
  30.         return mid;
  31.       }
  32.     }
  33.     if(dict.get(left)==target) return left;
  34.     if(dict.get(right)==target) return right;
  35.     return -1;
  36.   }
  37. }
复制代码


先在此谢过

上一篇:G家 面試題
下一篇:Python ood课程/书求推荐
全局:
我最近也在纠结二分查找,现在已经差不多想明白了,很多细节确实很烦。楼主这两个模版应该问题不大,不过需要多注意一些corner case。
回复

使用道具 举报

全局:
akdhfikbk 发表于 2019-10-29 11:15
我觉得应该是left跳出界了,XXXXXXXXXXXXXXXXX_____________Leftleft已经超出boundary,所以left==null了 ...

嗯,应该是这么个情况。我觉得你可以写 if(dict.get(left) != null && dict.get(left) == target) 试一下,这样如果第一个不成立就直接返回了。
回复

使用道具 举报

全局:
akdhfikbk 发表于 2019-10-29 06:52
可是我的compiler就跑不通啊摔!
生气!
program crash了啊 啊啊啊啊啊!

你在lc上的代码发出来看看呗。我就是用的这个。不过是 != null换成了 大于10000, 题目描述就是小于这个数。等于null那个条件我去掉了,那么大的整数肯定大于。。
回复

使用道具 举报

🔗
不知道小帅 2019-10-29 04:30:21 | 只看该作者
全局:
现在还是dictionary吗。。我感觉好像不是吧。。好像是大的整数,我用你的这个代码,把== null那里改成了 > 10000都跑得过啊。
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-10-29 06:31:57 | 只看该作者
全局:
不知道小帅 发表于 2019-10-29 04:30
现在还是dictionary吗。。我感觉好像不是吧。。好像是大的整数,我用你的这个代码,把== null那里改成了 >  ...

你用我的while(left+1<right) 这个写法吗》
回复

使用道具 举报

🔗
不知道小帅 2019-10-29 06:33:45 | 只看该作者
全局:
akdhfikbk 发表于 2019-10-29 06:31
你用我的while(left+1

就是复制了你的代码,就过了。肯定是这个啊。。前面都被注释掉了啊。
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-10-29 06:52:37 | 只看该作者
全局:
不知道小帅 发表于 2019-10-29 06:33
就是复制了你的代码,就过了。肯定是这个啊。。前面都被注释掉了啊。

可是我的compiler就跑不通啊摔!
生气!
program crash了啊 啊啊啊啊啊!
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-10-29 08:32:34 | 只看该作者
全局:
不知道小帅 发表于 2019-10-29 06:56
你在lc上的代码发出来看看呗。我就是用的这个。不过是 != null换成了 大于10000, 题目描述就是小于这个 ...


贴在这里了 https://ibb.co/x2tr2Nn
谢谢你先哈
回复

使用道具 举报

全局:
akdhfikbk 发表于 2019/10/29 08:32:34


贴在这里了 https://ibb.co/x2tr2Nn
谢谢你先哈
估计是因为left那里越界了吧?
回复

使用道具 举报

🔗
337845818 2019-10-29 10:29:36 | 只看该作者
全局:
不知道你怎么写的题目, function signature长得不一样,你的Dictionary不知道是什么, 我只能看见ArrayReader。
回复

使用道具 举报

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

本版积分规则

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