LeetCode系列之 (JavaScript) => 35. 搜索插入位置

题目描述:

解题思路分析:

考虑四种情况:

  1. 目标值在数组所有元素之前
  2. 目标值在数组所有元素之后
  3. 目标值存在于数组中
  4. 目标值在数组的范围内,但是不存在

针对第三种和第四种情况,可以考虑找到大于等于目标值的索引号,即满足条件。

另外,可以考虑用二分法,需要确定“循环不变量”(即区间定义)

不同解法:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */

// 暴力解法
var searchInsert = function(nums, target) {
    if(target < nums[0]){
        return 0;
    }else if(target > nums[nums.length-1]){
        return nums.length;
    }else{
        //只需要找到第一个大于等于target的就行
        // for(var i = 0; i<nums.length; i++){
        //     if(nums[i] >= target){
        //         return i;
        //     }
        // }
        var ind = nums.findIndex(v => {return v>=target});
        return ind;
    }
};

//二分法
var searchInsert = function(nums,target){
    var leftInd = 0;
    var rightInd = nums.length-1;
    // 定义target 实在闭合区间[leftInd,rightInd]
    while(leftInd <= rightInd){
        var midInd = leftInd + ((rightInd-leftInd) >> 1); //防止内存溢出 // 当区间只剩下偶数个的时候,中点取的是左边端点
        if(nums[midInd] > target){ //表示target在左区间
            rightInd = midInd - 1;
        }else if(nums[midInd] < target){ //表示target在右区间
            leftInd = midInd + 1;
        }else if(nums[midInd] == target){
            return midInd;
        }
    }
    return leftInd;// 结束循环时,当前的位置即为要返回的值
    //或 return rightInd + 1;
}

//大牛 solution - 二分法
// 考虑半开半闭区间 [leftInd, rightInd)
var searchInsert = function(nums,target){
    var leftInd = 0;
    var rightInd = nums.length; // 不同于上个方法
    if(nums.length == 0){
        return 0;
    }
    while(leftInd < rightInd){
        var midInd = leftInd + ((rightInd-leftInd) >> 1);
        if(nums[midInd] == target){
            return midInd;
        }else if(nums[midInd] > target){
            rightInd = midInd;
        }else if(nums[midInd] <  target){
            leftInd = midInd+1;
        }
    }
    return leftInd; // 结束循环的时候,leftInd和rightInd相等
}
posted @ 2022-02-25 16:34  77工作室  阅读(27)  评论(0编辑  收藏  举报