二分法的使用
### 解题思路
这题其实就是专门用来练二分法的 复习一下二分法 针对有序数组且无重复元素 时间复杂度O(logn)
首先就是 初始条件 left=0 right=数组长度-1
然后下面while循环的条件非常有考究的
在讲条件前,要注意对mid的定义声明要在该循环内,要不然边界改变时,mid的值不变的,会造成时间超时
mid = left + (right - left) / 2 ; 这样可以防止数据溢出
1.最基础的情况 左闭右闭情形[left,right]
此时条件为 left<=right 这样子就算二者相等 在该区间内仍然有效
并且后面边界条件改变时应加一
如:if (nums[mid] < target)
left = mid + 1; //
else if (nums[mid] > target)
right = mid - 1;
2.左闭右开 或者左开右闭 或者左开右开
这时条件 为left<right 因为如果二者相等 在该区间内不有效 会造成索引越界
并且后面边界条件改变也要变(就是那边区间是开的 响应的边界条件=mid)
如:if (nums[mid] < target) //这个情形是左开右开
left = mid ; //想一想如果+1 会造成搜索时少看一个元素
else if (nums[mid] > target)
right = mid ;
拿个例子自己研磨就懂了
### 代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
else
return mid;
}
return right + 1; // 最后面返回的值也是要看区间闭合情况 这个是插入的值,如果右边是开的 就直接返回right的值,看 前面边界的值条件变化 好好想想
}
};
```