35. 搜索插入位置

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

请必须使用时间复杂度为 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

示例4:

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

示例5:

输入: nums = [1], target = 0
输出: 0

解题方法:二分查找

class Solution {
    func searchInsert(_ nums: [Int], _ target: Int) -> Int {
        var left = 0
        var right = nums.count - 1

        while left <= right {
            let mid = left + (right - left) / 2
            if nums[mid] >= target {
                if mid == 0 || nums[mid - 1] < target {
                    return mid
                } else {
                    right = mid - 1
                }
            } else {
                left = mid + 1
            }
        }

        return nums.count
    }
}

解题思路:

通过分析题目我们可以看出,本题是要找到第一个满足大于等于 target 的元素,如果则把元素放在最后面。

这是二分查找的类型之一:找出第一次出现满足某个条件的元素。

复杂度分析

  • 时间复杂度:O(logn),其中 n 为数组的长度。
  • 空间复杂度:O(1)

参考链接