第一次超时代码:
public int search(int[] nums, int target) {
int len=nums.length;
int left=0,right=len-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]>target){
right=mid;
}
else{
left=mid;
}
}
return -1;
}
这里超时我以为是在left==right且没有找到target的时候疯狂循环,于是就改了循环条件中的=去掉试了一下,
第二次超时代码:
public int search(int[] nums, int target) {
int len=nums.length;
int left=0,right=len-1;
while(left<right){
int mid=(left+right)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]>target){
right=mid;
}
else{
left=mid;
}
}
return -1;
}
这里又超时,我想到就算去了=,left=right-1的情况下,会一直出现left=mid,也就是left=left,依然会出现之前的状态疯狂循环,于是我在后面加了个跳出条件,没有超时但是报错了,在用例数组长度只有1个的时候明显没有进入循环,
第三次错误代码:
public int search(int[] nums, int target) {
int len=nums.length;
int left=0,right=len-1;
while(left<right){
int mid=(left+right)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]>target){
right=mid;
}
else{
left=mid;
}
if(left==right-1)
break;
}
return -1;
}
将循环条件加上=之后,代码只比也第一次代码多了一个跳出条件,但仍然存在问题,在left==right-1的情况下直接跳出可能会导致有一端没有与target比较就得出-1,而改成left==right就又会出现可能在left==right-1时疯狂循环。在判定nums[mid]<target时,显然nums[mid]!=target,那么left就没有必要再赋值mid与target比较了,如果改为left=mid+1,那么在left=right-1的情况下,在循环时mid=left,此时若未找到target则left=mid+1,此时left==right,就可以完成最后一个值与target的比较,right同理。
通过代码:
public int search(int[] nums, int target) {
int len=nums.length;
int left=0,right=len-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]>target){
right=mid-1;
}
else{
left=mid+1;
}
}
return -1;
}
题目链接[:](704. 二分查找 - 力扣(LeetCode))