1.二分查找动态图
2.二分查找的基础了解
- 概念:
在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
- 代码重难点:
1.区间的边界符号,到底取闭区间还是开区间,如right=middle还是middle-1
2.while(left right)循环中取=还是不取
3.代码具体实现
- [left,right]
- [left,right)
- (left,right]
解析[left,right]为例,求目的target
class Solution {
public int[] BinarySearch(int[] numbers) {
int left = 0;
int right = numbers.length-1;
while(left<=right){
middle = left + (right-left)>>1;
if(nums[middle]>target){
right = middle-1;
}else if(nums[middle]<target){
left = middle+1;
}else{
return middle;
}
}
}
1.因为是[left,right]左闭右闭,所以这里的while取=是合法区间,是可以取的
while(left<=right)
2.这里计算middle的时候要注意right+left可能会超出最大数字,因此为了避免这种情况,要使用下面这种方式计算
middle = left + (right-left)>>1;
3.这里的right取middle-1是因为条件判断出了nums[middle]已经是比target大,因此,就不需要再包含middle
if(nums[middle]>target) right = middle-1
[left,right)
class Solution {
public int[] BinarySearch(int[] numbers) {
int left = 0;
int right = numbers.length-1;
while(left<right){
middle = left + (right-left)>>1;
if(nums[middle]>target){
right = middle;
}else if(nums[middle]<target){
left = middle+1;
}else{
return middle;
}
}
}
1.因为是[left,right)左闭右开,所以这里的while取=是不合法区间,因为当都为1的时候,就是[1,1)不合理
while(left<=right)
2.这里的right取middle是因为[left,right),右边是)没有取right这个值,并判断出了nums[middle]已经是比target大,因此下一个搜索的区间(即左区间0到middle)就不包括middle,就需要再包含middle
if(nums[middle]>target) right = middle-1
参考文章