首页 > 其他 > 详细

二分查找杂谈

时间:2020-04-19 22:35:50      阅读:62      评论:0      收藏:0      [点我收藏+]
技术分享图片
 1 int binarySearch(int[] nums, int target){
 2   if(nums == null || nums.length == 0)
 3     return -1;
 4 
 5   int left = 0, right = nums.length - 1;
 6   while(left <= right){
 7     // Prevent (left + right) overflow
 8     int mid = left + (right - left) / 2;
 9     if(nums[mid] == target){ return mid; }
10     else if(nums[mid] < target) { left = mid + 1; }
11     else { right = mid - 1; }
12   }
13 
14   // End Condition: left > right
15   return -1;
16 }
View Code

模板一思考:对于二分查找,选择判断条件是一个难点。

1.while()里到底是<=还是<,当我们选择<=的时候,就要记住当left>right才会退出循环,所以说我们已经把数组里的元素全都扫过一遍了

如果只是单纯的用target去找一个相等的数的话,当循环结束了就等于未找到,我们将return -1;

对于某些会出现死循环的场景<=就不适用了,假设我们去找无序数组的峰值。在边界条件下,我们始终是让mid和后一个数比较,

如果找到的后一个数较小,我们就收缩右区间,让right指向它。这样就差不多可以知道,如果我们用<=的话,当我们找到那个最小值的

时候,该值肯定是比后一个数小的,所以我们就一直执行right=mid,然后就死循环。但如果我们用<的话,当left=right,我们就退出了循环,

其实我们就已经找到了那个值,直接返回就行了。

技术分享图片
 1 int binarySearch(int[] nums, int target){
 2   if(nums == null || nums.length == 0)
 3     return -1;
 4 
 5   int left = 0, right = nums.length;
 6   while(left < right){
 7     // Prevent (left + right) overflow
 8     int mid = left + (right - left) / 2;
 9     if(nums[mid] == target){ return mid; }
10     else if(nums[mid] < target) { left = mid + 1; }
11     else { right = mid; }
12   }
13 
14   // Post-processing:
15   // End Condition: left == right
16   if(left != nums.length && nums[left] == target) return left;
17   return -1;
18 }
View Code

 

 

    

二分查找杂谈

原文:https://www.cnblogs.com/szzla/p/12733492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!