二分法的相应算法题

77 阅读1分钟

1.在有序数组中找某个数a是否存在,存在返回下标否则返回-1

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let l = 0, r=nums.length-1,mid;

    while(l<=r){
        mid = l + ((r-l)>>1);
        if(nums[mid] < target) l = mid+1;
        if(nums[mid] > target) r = mid-1;
        if(nums[mid] == target) return mid;
    }
    return -1;
};

2.在有序数组中找>=某个数a最左侧的位置

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let l = 0, r=nums.length-1,mid,res;

    while(l<=r){
        mid = l + ((r-l)>>1);
        if(nums[mid] < target) l = mid+1;
        if(nums[mid] > target) r = mid-1;
        if(nums[mid] == target){
            if(nums[mid-1] != target){
                res = mid;
            }
        };
    }
    return res;
};

3.局部最小值的问题

4.在排序数组中查找元素的第一个和最后一个位置

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    let l=0,r=nums.length -1,mid;
    while(l<=r){
         mid= l + ((r-l)>>1); //取中间下标,防止溢出
        //中间值小于目标值,则目标值在右边, 从中间值后一个值往右查找。
        if(nums[mid]<target) l = mid + 1;

        if(nums[mid]>target) r = mid - 1;

        if(nums[mid] == target) break;
    }
    let leftIndex= mid,rightIndex =mid;

    while(nums[mid] == nums[leftIndex-1]) leftIndex--;
    while(nums[mid] == nums[rightIndex+1]) rightIndex++;
    return [leftIndex,rightIndex];
};