[路飞]_搜索插入位置

126 阅读1分钟

35. 搜索插入位置

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

请必须使用时间复杂度为 O(log n) 的算法。

示例1

输入: nums = [1,3,5,6], target = 5
输出: 2

示例1

输入: nums = [1,3,5,6], target = 2
输出: 1

题解

二分法

题目中说排序数组找到目标值,这里给出两个信息:数组有序和目标值(唯一);并且要求使用时间复杂度为 O(log n) 的算法。提示很明显利用二分法查找目标值。

对于任意区间[0,len][0,len]:当有nums[index1]<targetnums[index]nums[index−1]< target ≤ nums[index]成立 index 即为目标值插入的位置。

套路二分法,假设数组长度为lenght,二分法模版代码如下

let left = 0let right = length
 while(left < right){
        const mid = Math.floor(left +( right - left) / 2 );
        if(mid === target) return mid;
        if(mid < target) {
            left = mid+1;
        }else{
           right = mid - 1;
        }
    }

稍微修改一下,因为目标值可能大于当前数组所有元素,此时target需要插入数组长度的位置

代码

var searchInsert = function(nums, target) {
    let len = nums.length;
    let left = 0;
    let right = len-1;
    while(left <= right){
        const mid = Math.floor(left +( right - left) / 2 );
        if(nums[mid] === target) return mid;
        if(nums[mid] < target) {
            left = mid+1;
        }else{
            right = mid - 1;
        }
    }
    return left

};