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

[Leetcode] Find K Closest Elements这题找到最值后的TwoPointer的边界条件

全局:

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

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

x
本帖最后由 akdhfikbk 于 2019-10-24 03:51 编辑

大家好,我又想秃头都想不出来为何了
这道是Lc658
我的代码思路是,先用binary search找到距离target最近的值,然后围绕这个找到的最值,发展TwoPointer寻找距离最值最近的k个值,然后依次加入需要返回的k个数的数组
目前问题出现在 最后一步:然后依次加入需要返回的k个数的数组
代码如下:
  1. public class kClosestInSortedArray {
  2.         public static int[] kClosest(int[] array, int target, int k) {
  3.             if(array==null || array.length==0) return new int[] {-1,-1};
  4.             int left=0, right=array.length-1;
  5.             int find=0;
  6.             while(left+1<right){
  7.               int mid= left+(right-left)/2;
  8. //              if(array[mid]==target){
  9. //                find=mid;
  10.               if(array[mid]==target){
  11.                         left=mid;
  12.               }else if(array[mid]<target){
  13.                 left=mid;
  14.               }else{
  15.                 right=mid;
  16.               }
  17.             }
  18.             //先把距离最近的找出来
  19.             if(Math.abs(array[left]-target)<Math.abs(array[right]-target)){
  20.               find=left;
  21.             }else{
  22.               find=right;
  23.             }
  24.             //再找距离最近那个indexk个小的
  25.             int [] res= new int[k];
  26.             int L=find, R=find+1;
  27.             
  28.             for(int i=0; i<k;i++){
  29.                     //为何这里R要>=array.length 这样不就是出界了吗
  30. //我涉猎的答案 在这里讲这里合并成了 if(R>=array.length || L>=0 && target - array[L] <= array[R]-target){
  31.               if(L>=0 && R<=array.length-1 &&k>=0){ //现在就剩下这一个边界条件了
  32.                 if(Math.abs(array[L]-target)>=Math.abs(array[R]-target)){
  33.                   //将R加入k个int[]的最后一位
  34.                         //因为是比谁小,所以需要正序排列
  35.                   res[i]=array[R];
  36.                   R++;
  37.                 }else{
  38.                           res[i]=array[L];
  39.                           L--;
  40.                           

  41.                 }
  42.               }
  43.             }
  44.             return res;
  45.           }

  46.         public static void main(String[] args) {
  47.                 int [] arr= {1,5};
  48.                 System.out.println(Arrays.toString(kClosest(arr,10,1)));

  49.         }

  50. }
复制代码


目前深感小妹才疏学浅,暂时还炼不到 if(R>=array.length || L>=0 && target - array[L] <= array[R]-target) 这样的边界
不懂为何不能按照小妹line 31 那样写,限制左右的边界条件之后,再比较两边的Math.abs()呢?
小妹知道,如果R被限制出不越界 if就进不去了,还是想不通 为什么要提前把R限制在array.length之外?
虚心认真求教
先拜谢大佬。
[/i][/i]

上一篇:Python
下一篇:一道我不知道怎么分类的面试题
🔗
floatingpoints 2019-10-24 21:35:22 | 只看该作者
全局:
你的哪个判断条件有问题,万一你左边的数已经取完了但是右边还有数,并且还没取够k个数。。。。另外这题从左右两边向中间走比较好吧,省去了binary search的那一步
回复

使用道具 举报

🔗
1点50分 2019-10-24 23:38:04 | 只看该作者
全局:
代码有点乱,不是很懂你要问什么。后面你应该把思路捋清楚,然后再优化代码
1. 左右两边都在区间内
2. 左边valid,右边invalid
3. 左边invalid, 右边valid
这样就全集了。
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-10-26 00:41:20 | 只看该作者
全局:
1点50分 发表于 2019-10-24 23:38
代码有点乱,不是很懂你要问什么。后面你应该把思路捋清楚,然后再优化代码
1. 左右两边都在区间内
2. 左 ...

问题是我写的代码边界条件不对: if(L>=0 && R<=array.length-1 &&k>=0)
答案是写成:if(R>=array.length || L>=0 && target - array[L] <= array[R]-target)
为什么要让R>=array.length?
回复

使用道具 举报

全局:
akdhfikbk 发表于 2019/10/26 00:41:20
问题是我写的代码边界条件不对: if(L>=0 && R<=array.length-1 &&k>=0)
答案是写成:if(R>=array.length || L>=0 && target -...
我感觉没有认真看我的回复。左右都可能会超出边界
回复

使用道具 举报

🔗
bz97 2019-10-27 04:43:10 | 只看该作者
全局:
akdhfikbk 发表于 2019-10-26 00:41
问题是我写的代码边界条件不对: if(L>=0 && R=0)
答案是写成:if(R>=array.length || L>=0 && target - ...

R>=array.lenght 的时候, 你就只加入左边指针指向的元素,因为右边已经超出边界,没有元素了
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2019-10-28 05:49:39 | 只看该作者
全局:
bz97 发表于 2019-10-27 04:43
R>=array.lenght 的时候, 你就只加入左边指针指向的元素,因为右边已经超出边界,没有元素了

是的!懂了!
多谢热心解答!
回复

使用道具 举报

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

本版积分规则

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