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)
。