持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
搜索插入位置
这是力扣第35题
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
解题思路
这是一道简单题,题目不难,但是规定了要使用时间复杂度为O(log n)的算法,这一点对解题思路上来说会有一些限制。接下来就来介绍几种不同的解题思路来给大家看一看。
循环法
循环法顾名思义,就是将数组循环遍历一遍,不过在循环前需要使用 indexOf(target) 将目标值记录下来,这是循环的条件。当目标值在数组中,就返回该目标值的下标;如果不在,则就继续遍历。
相关代码如下:
var searchInsert = function(nums, target) {
let result = nums.indexOf(target)
if (result === -1) {
for (let index in nums) {
if (nums[index] > target) return index
if(nums[nums.length-1] < target) return nums.length
}
} else {
return result
}
二分法
我们只需要在数组中找到一个存在的目标值即可,典型地可以使用二分法来解决。用二分法逼近查找第一个大于等于目标值的下标。不过对于二分法来说,一定要处理好相关边界问题,关于边界问题的处理,之前的文章里有提到过。
相关代码如下:
var searchInsert = function(nums, target) {
const n = nums.length;
let left = 0, right = n - 1, ans = n;
while (left <= right) {
let mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
};
indexOf法
这个思路就是单纯地使用 indexOf 方法来解决这道题目。首先利用 indexOf 方法判断数组中是否有目标值 target,有的话就返回下标,如果返回值小于0的话直接将目标值加入到数组中并对数组进行排序,然后遍历输出目标值 target 在新数组中的下标。这种方法很简单,比较容易理解,大家可以多研究一下 indexOf 方法的妙用。
相关代码如下:
var searchInsert = function(nums, target) {
let index = nums.indexOf(target)
if (index>=0) {
return index
}else{
nums.push(target)
nums.sort((a,b)=>a-b)
let index = nums.indexOf(target)
return index
}
};
总结
以上就是对 力扣 35 题搜索插入位置 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。