思路:
数组为不重复的数组,求找不到时插入的位置(即找第一个大于它的值)。
左闭右闭,最后一下循环是l==r,那么最后是l=mid+1先(取决于代码先后写的顺序),r=mid
找不到时有三种情况。
1、左闭右闭是r+1
// 分别处理如下四种情况 // 目标值在数组所有元素之前 [0, -1] // 目标值等于数组中某一个元素 return middle; // 目标值插入数组中的位置 [left, right],return right + 1 // 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1
2、左闭右开是r
// 分别处理如下四种情况 // 目标值在数组所有元素之前 [0,0) // 目标值等于数组中某一个元素 return middle // 目标值插入数组中的位置 [left, right) ,return right 即可 // 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right
储备:
问题重点:
最后:
左闭右开:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n=nums.size();
int l=0,r=n;//左右指针。左闭右开
while (l<r) {//l==r时区间无效
int mid=l+(r-l)/2;
if (nums[mid]==target) return mid;
else if (nums[mid]<target) l=mid+1;
else r=mid;//保持区间无效
}
return r;
}
};
左闭右闭:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n=nums.size();
int l=0,r=n-1;//定义左右指针。左闭右闭
while (l<=r) {//相等时区间有效
int mid=l+(r-l)/2;//防溢出
if (nums[mid]==target) return mid;
else if (nums[mid]<target) l=mid+1;
else r=mid-1;//保持循环不变量
}
//找不到时有三种情况。1、最前:最后一次循环是[r-1,0==l]
// 2、中间,有两条分支,所以有两种情况:
//最后一次循环可能是[r-1,mid==l](target在nums[mid]左边),r在mid左边,要插在mid的位置,
//也可能是[mid==r,l+1](target在nums[mid]右边),要插在mid右边。
// 3、最后:最后一次循环是[n-1==r,l]
return r+1;
}
};


被折叠的 条评论
为什么被折叠?



