leetcode hot100刷题日记——17.搜索插入位置
哈喽~第二周刷题开始了,今天这道题虽然属于简单,而且是二分查找模板题,但是我太菜了我感觉有好多可以让我思考的地方。
就一起看看这道题目吧~
解答:
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
和二分查找又一样了对不对??