Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情。
一、题目描述:
- 搜索插入位置 —— 难度简单
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 <= 10^4
-10^4 <= nums[i] <= 10^4
nums 为 无重复元素 的 升序 排列数组
-10^4 <= target <= 10^4
二、题目和思路分析:
这道题是简单题,不过要求O(log n)的时间复杂度,其实也不是那么简单,还是有点难度的。
既然有时间复杂度的要求,并且是排序的数组,那么使用二分查找方法是再适合不过的。
二分查找取数组中间值与目标值对比,如果相等则直接返回档期啊中间值下标,如果小于或大于目标值,则将数组范围缩小一半,继续查找,知道目标范围为1或者找到目标值。
三、代码:
代码实现如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let i = 0
let j = nums.length - 1
while(i <= j) {
let mid = i + ((j - i) >> 1)
if (nums[mid] === target) {
return mid
} else if (nums[mid] < target) {
i = mid + 1
} else if (nums[mid] > target) {
j = mid - 1
}
}
return i
};
四、总结:
这道题用来考察基本的二分查找还是很有意思的,确实是比较简单的一道题,题目写的也比较清晰,做起来也比较顺畅。
加油吧!