LeetCode_[35. 搜索插入位置]

前言:JavaScript版。呃呃呃,一开始我的题解没用到什么算法,后面想到了用二分查找。

看题

35. 搜索插入位置 - 力扣(LeetCode)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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),优化好多。

敬上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值