直接上模板代码,鼠鼠脑子记不住那么多不同的代码,所以采取先记住代码,根据题目得出结果的策略。
int binary(vector<int>& nums, int target)
{
int left=0;int right=nums.size()-1;
while(left<=right)//注意这边是小于等于
{
int mid=(left+right)/2;
if(nums[mid]>=target)//这边是大于等于
{
right=mid-1;
}
else
left=mid+1;
}
return left;
}
分情况讨论
一、基础情况:找有没有正确的值,如果没有找到就返回应该插入的位置
例:[5,7,8,9,10]
题目详见leetcode:
https://leetcode.cn/problems/search-insert-position/?envType=study-plan-v2&envId=top-100-liked
- 如果有正确的值,上面代码运行出来的left一定是target所在的位置,right就在left前一个。
- 如果不存在该值,则left指向的是第一个大于该值的位置,right指向的是第一个小于该值的位置。
二、数组中有重复的值,要求某个值的开始和结束位置
例:[5,7,7,8,8,10],target=8
返回 [3,4]
题目详见leetcode:
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked
-
如果该值存在,则获得了left就是该值的开始位置。
结束位置,其实就是求target+1的left,将该left-1就可以获得target的结束位置。
说明:如果target+1存在,target+1的left很容易理解就是target+1的开始位置;如果target不存在,target+1的left指向的是第一个大于target+1的位置。无论是哪种情况,肯定在target结束位置的右边第一个。 -
如果该值不存在,则left指向的是第一个大于该值的位置,right指向的是第一个小于该值的位置。(与基础情况一样)
所以target的开始和结束位置就如下:
int begin= binary(nums,target);
int end= binary(nums,target+1)-1;