先分析对区间的定义,才能把握while(left>right)还是while(left<right),right=middle-1还是right=middle,可以把区间的定义理解为不变量,一开始定义的区间左闭右闭,那后面也得坚持左闭右闭
左闭右闭写法
left = 0;
right = num.size-1;
while(left<=right)
middle=(left-nums.size)/2
if(nums(middle)>taget)
right=middle-1;
else if(nums(middle)<taget)
left=middle+1;
else return middle
return -1
public int search(int[] nums, int target) {
//避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if(target <nums[0] || target > nums[nums.length-1]){
return -1;
}
int left=0,right = nums.length-1;
while(left<=right){
int mid =left+((right-left)>>1);
if(nums[mid] ==target)
return mid;
else if(nums[mid]<target)
left = mid+1;
else if (nums[mid]>target)
right = mid-1;
}
return -1;
}
左闭右开写法
left=0
right=nums.size-1
while(left<right){
middle=(left-nums.size)/2
if(nums[middle]>target)
else if(nums[middle]<target)
else return middle+1
}
return -1