搜索插入位置(easy)
更好的阅读体验应该是:
- 审题-思考
- 答题
- 整理-归纳
一、题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
二、题解
分析题干
分析题目很重要,每次阅读题目都要感谢当年做的那么多阅读理解,本题中,我们得知:
- 数组是排过序的数组
- 无重复元素
题解一(暴力法)
提到暴力法,就是频繁的使用遍历,且没有所谓的“套路”,从上倒下透漏出的都是实在!
时间复杂度:O(n)
空间复杂度:O(1)
思路
- 找到第一比 target 大的元素,它的下标,就是要答案。
实现
var searchInsert = function(nums, target) {
const len = nums.length;
for (let i = 0; i < len; i++) {
if (nums[i] >= target) {
return i;
}
}
return len;
};
题解二(二分法)
在一个排序的数组查找,我们可以使用二分法
我们的目的是:查找一个下标index
,我们要找的nums[index] <= target
的第一个值。
如果找不到,就返回数组的长度
时间复杂度:O(log(n))
空间复杂度:O(1)
var searchInsert = function(nums, target) {
const len = nums.length;
let left = 0; //左边界
let right = len - 1; // 右边界
let ans = len; // 返回值,注意如果目标不在数组中,返回数组的长度
while (left <= right) {
mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
// 证明左边界在数组内部
ans = mid; // 更新返回值
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
};
三、写在最后
这是二分法解题的第一片文章,二分法具体是做什么的,以及其他应用场景我会在新的单章里发出,共勉
关于我
- 花名:余光
- WX:j565017805
- 沉迷JS,水平有限,虚心学习中
其他沉淀
如果您看到了最后,不妨来个三连吧,这就是对我最大的鼓励!