这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
前言
js每日一道算法练习题,今日继续,今天工作搞的好烦,各种情况下的页面刷新,等有空闲了把前端用到的各种刷新方式都整理一下,言归正传,今天来一道简单的题泄泄
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
解题思路
- 题目中的要求是判断目标数字是否在目标数组中,如果在的话就输出目标数字的下标,如果不在的就返回它将被插入的位置
- 根据题目要求以及给的条件,我们可以通过二分查找来找到存在数组中的情况的下标,通过二分查找不断的逼近和目标数组相等的数字即可得到结果,下面上代码
var searchInsert = function(nums, target) {
const n = nums.length;
let left = 0, right = n - 1, curr = n;
while (left <= right) {
let mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
curr = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return curr;
};
- 上面代码通过二分查找可以达到我们想要的结果,但上述代码还使用到了位运算,看起来还是挺麻烦的
- 作为一个合格的api调用工程师怎么能放着api而不用呢,二话不说,我直接想到了sort和indexOf,如果用上这两个api我们就要分两种情况,一种是输入数字已经在数组中,那我们直接输出nums.indexOf(target)即可,如果输入数字不存在于数组中,那我们不妨先把这个数字push到数组中,再进行排序,然后再输出nums.indexOf(target)即可, 不出所料,果然可行,代码如下
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
result = nums.indexOf(target)
if(result>=0){
return result
}else{
nums.push(target)
let arr = nums.sort((a,b)=>a-b)
return arr.indexOf(target)
}
};
总结
api工程师没跑了,哈哈哈,虽然使用sort结合indexOf能解决问题,并且代码看起来更少,但其实它的效率是很低的,不如二分查找的方法效率高,能不用这种方法还是不要用,话不多说,继续努力,gogogo!!!