leetcode hot100刷题日记——17.搜索插入位置

哈喽~第二周刷题开始了,今天这道题虽然属于简单,而且是二分查找模板题,但是我太菜了我感觉有好多可以让我思考的地方。
就一起看看这道题目吧~
leetcode hot100刷题日记——17.搜索插入位置_第1张图片
解答:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        //直接二分查找模板
        int n=nums.size();
        int left=0,right=n-1;
        int mid=0;
        while(left<=right){
            mid=left+(right-left)/2;
            if(target>nums[mid]){
                left=mid+1;
            }else{
                right=mid-1;
            }
        }
        return left;
    }
};

时间复杂度:O(logn)
空间复杂度:O(1)

思考:
为什么返回left就可以得到target要插入的位置呢?
left 指向的是 第一个大于或等于 target 的位置。
right 指向的是 最后一个小于 target 的位置。

我们都知道二分查找原来是返回mid,即nums[mid]=target.
在我们的代码中,这时right会赋值为mid-1。之后如果left<=right,会继续循环,但此时只有left会增加而right不变,直到while判定条件为否。

理解:right已经到头了,right不会再变了。left要逐渐逼近right

而退出while的时候,left一定为right+1,即left=mid-1+1=mid
注意这里mid我加粗了,这里mid不是每次循环在变的mid,而是之前的right的值的那个mid

也就是说,nums[left]=nums[mid]=target
和二分查找又一样了对不对??

你可能感兴趣的:(力扣刷题专栏,leetcode,算法,职场和发展)