前言:JavaScript版。呃呃呃,一开始我的题解没用到什么算法,后面想到了用二分查找。
看题
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为
O(log n)的算法。
题解1,用JavaScript自带函数。
includes()先查找元素是否存在,存在就用findIndex()返回索引;不存在就先将元素插入,用sort()排序,再用findIndex()返回索引。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
if (nums.includes(target)) {
return nums.findIndex(num => num === target);
} else {
nums.unshift(target);
nums.sort((a, b) => a - b);
return nums.findIndex(num => num === target);
}
};
时间复杂度O(NlogN),空间复杂度O(N)。
题解2:二分查找
呃呃其实那个sort没啥必要,因为原数组已经是有序的了,因此时间复杂度和空间复杂度都有点浪费。而我们引入二分查找之后,通过计算中间值mid来与目标值target进行比较迭代。如果最后查找不到,那么left就是要插入的位置;而查找到了,返回索引就行。有个痛点是要用Math.floor()来保留整数。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left=0,right=nums.length-1;
while(left<=right){
let mid=Math.floor((left+right)/2);
if(nums[mid]===target){
return mid;
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return left;
};
时间复杂度O(logN),空间复杂度O(1),优化好多。
敬上。
556

被折叠的 条评论
为什么被折叠?



