题目

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums无重复元素升序 排列数组
  • -104 <= target <= 104

解答

目标元素有以下几种情况:

1.插入在数组头部

2.插入数组中某个位置

3.在数组中找到该元素

4.插入数组尾部

因此可用顺序遍历或者二分查找来解题

  1. 顺序遍历整个数组的暴力解法
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] == target)
            {
                return i;
            }
            else if(nums[i] > target){
                return i;
            }
        }
        return nums.size();
    }
};
  1. 使用二分查找法进行位置的查找
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int l=0,r=nums.size()-1;
// 我们定义target在左闭右闭的区间里,[left, right] ,当left==right,区间[left, right]依然有效
        while(l<=r)
        {
            int mid=l+(r-l)/2;
            if(nums[mid]<target)
            {
                l=mid+1;// target 在右区间,所以[middle + 1, right]
            }
            else if(nums[mid]==target)
            {
                return mid;
            }
            else
            {
                r=mid-1;// target 在左区间,所以[left, middle - 1]
            }
        }
        return r+1;
    }
};