Skip to content

二分

704:https://leetcode.cn/problems/binary-search/

红蓝染色法: right(>=target)表示第一个符合条件的元素 left (< target) 表示不符合条件的最后一个元素

反正就记住left是最后一个,right是一个。 找头用 <,找尾用 <=。 求left的时候用nums[mid]<=target; 求right的时候用nums[mid]< target;

34.在排序数组中查找元素的第一个和最后一个位置: https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/

/**

  • @param {number[]} nums
  • @param {number} target
  • @return {number} */ var search = function(nums, target) {

let left = -1; let right = nums.length;

while(left + 1 <right){ const mid = left + ((right-left)>>1)

if(nums[mid]<target){
    left = mid;
}else{
    right = mid;
}

}
if(nums[right]!==target || right===nums.length){ return -1 } return right; };

/**

  • @param {number[]} nums

  • @param {number} target

  • @return {number[]} */ var searchRange = function(nums, target) {

    const binarySearch = (isFirst) => {

     let left = -1;
     let right = nums.length;
    
     while( left+1 < right ){
    
         const mid = left + ((right-left)>>1);
    
         if(isFirst){ // 第一个符合条件的数用小于
             if(nums[mid]<target){
                 left = mid;
             }else{
                 right = mid;
             }
         }else{ // 最后一个符合条件用小于等于
             if(nums[mid]<=target){
                 left = mid
             }else{
                 right = mid;
             }
         }
     }
    
     if(isFirst) return right;
     return left;
    

    }

    const start = binarySearch(true);

    if(start===nums.length || nums[start]!==target){ return [-1,-1]; }

    const end = binarySearch(false);

    return [start,end]; };

本站访客数 人次 本站总访问量