一、对二分法查找的理解
定义:二分法查找即将查找的数一分为二,用中间的数与左右两边的数比较再更新对应边的内容,每次压缩一半的查找内容直到得出结果。
适用条件:有序且无重复元素的数组
二、左闭右闭型
循环不变量:即从始至终坚持同一个原则,在本题看来就是坚持保证左右两边的数皆可取得。
原理:left<=right,left,right均可取得;
当nums[middle]>target时,right=middle-1;middle可取且明确的大于target,target不可能等于middle,所以在更新right时应除去middle,若未删去middle,同一个middle将在参与两个循环。
当nums[middle]<target时,left=middle+1;同理。
三、代码
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int middle=(left+right)/2;
while(left<=right){
if(nums[middle]>target){
right=middle-1;
}else if(nums[middle]<target){
left=middle+1;
}else{
return middle;
}
}
return -1;
}