LeetCode 35 搜索插入位置

链接:https://leetcode-cn.com/problems/search-insert-position

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2
示例 2:

输入: [1,3,5,6], 2
输出: 1
示例 3:

输入: [1,3,5,6], 7
输出: 4
示例 4:

输入: [1,3,5,6], 0
输出: 0



这道题因为有两段性的关系,所以呢也可以用二分来做,两段性质分别是,左边的所有数都小于target,而右边的所有数都大于或等于target。那么我们定义一个check函数,看一下满足大于等于target的所有点中,第一个点的位置,那个位置就是我们所要求的解啦。check函数为 if (某个数 >= target)。那么我们要记住,当我们要算满足后面一段性质的解的时候,更新方式是 r = mid, l = mid + 1.

可以看出来,满足后面一段的性质的表现是大于等于,满足前面一段的性质的表现是小于等于。并且解都要包含在前一段或后一段性质里面。

c++代码如下:

 1 class Solution {
 2 public:
 3     int searchInsert(vector<int>& nums, int target) {
 4         if(nums.empty() || nums.back() < target) return nums.size();
 5         int l = 0, r = nums.size() - 1;
 6         while(l < r){
 7             int mid = l + r >> 1;
 8             if(nums[mid] >= target) r = mid;
 9             else l = mid + 1;
10         }
11         return r;
12     }
13 };

在这道题中,开头还要错判一下,如果数组是空的,或者最后一个数都小于target,注意没有等于,等于的情况包含在下面的判断里面,那么直接返回数组的size就好。

 

posted @ 2019-09-25 10:08  wtzhang  阅读(211)  评论(0编辑  收藏  举报