LintCode - Binary Search 二分法总结

难点1: 搞清楚左右边界

难点2: 写合适的if condition

 

基础

Classical Binary Search [easy]

int findPosition(vector<int> &nums, int target) {
    int l=0, r=nums.size();
    while(l<r){
        int mid = l+(r-l)/2;
        if(nums[mid]==target) return mid;
        else if(target>nums[mid]) l= mid+1;
        else r=mid;
    }
    return -1;
}

First Position of Target [easy] (lower_bound)

int binarySearch(vector<int> &nums, int target) {
    int l=0, r=nums.size()-1;
    while(l<r){
        int mid = l+(r-l)/2;
        if(nums[mid]<target) l=mid+1;
        else r=mid;
    }
    return nums[r]==target ? r:-1;
}

Last Position of Target [easy] (upper_bound)

int lastPosition(vector<int> &nums, int target) {
    if(nums.empty()) return -1;
    int l=0, r=nums.size();
    while(l<r){
        int mid = l+(r-l)/2;
        if(nums[mid]<=target) l=mid+1;
        else r=mid;
    }
    return nums[r-1]==target ? r-1:-1;
}

 

改变if condition

First Bad Version [median]

Search In a Big Sorted Array [median] (难点:确定upper bound)

Find Minimum in Rotated Sorted Array [median], II [median] (with duplicate, 难点:nums[mid]==nums[r])

Maximum Number in Mountain Sequence [median] (one peak)

Find Peak Element [median](one of multiple peaks), II [hard] (matrix)

Search in Rotated Sorted Array [median]

 

同一问题重复使用BS

Search a 2D Matrix [easy], II [median] (a special trick)

Search for a Range [median]

Smallest Rectangle Enclosing Black Pixels [hard] (难点:1.if condition 2.用一个binary search归纳4个)

 

Rotate Array

Recover Rotated Sorted Array

Rotate String


版权声明:本文为real_lisa原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。