二分查找

2017-10-18  本文已影响0人  wayyyy
二分查找.png
非递归版本
int binarySearch(const vector<int>& vec, int targetNum)
{
    int lo = 0;
    int hi = vec.size()-1;

    while(lo <= hi) {
        int mid = (hi + lo) / 2;    // mid=lo+(hi-lo)/2 这样写还可以防止溢出
        
        if (vec[mid] == targetNum)
            return mid;
        else if (vec[mid] < targetNum)
            lo = mid + 1;
        else if (vec[mid] > targetNum)
            hi = mid - 1;
    }

    return -1;
    // return lo  lo是该数据应该插入的位置。
}
递归版本
int binarySearch(const vector<int>& vec, int lo, int hi, int targetNum)
{   
    if (lo <= hi)
        return -1;
    
    int mid = (hi + lo)/2;  

    if (vec[mid] < targetNum)
        return binarySearch(vec, mid+1, hi, targetNum);
    else if (vec[mid] > targetNum)
        return binarySearch(vec, lo, mid-1, targetNum);
    else
        return mid;
} 
对二分查找分析
35. 搜索插入位置
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int startIndex = 0;
        int endIndex = nums.size() - 1;
        int midIndex = 0;
        while(startIndex <= endIndex)
        {
            auto midIndex = startIndex + (endIndex - startIndex) / 2;
            if (nums[midIndex] == target)
                return midIndex;
            else if (nums[midIndex] > target)
                endIndex = midIndex - 1;
            else if (nums[midIndex] < target)
                startIndex = midIndex + 1;
        }

        return startIndex;
    }
};
367. 有效的完全平方数
278. 第一个错误的版本
场景一:isBadVersion(mid) => false

 1 2 3 4 5 6 7 8 9
 G G G G G G B B B       G = 正确版本,B = 错误版本
 |       |       |
left    mid    right

场景二:isBadVersion(mid) => true

 1 2 3 4 5 6 7 8 9
 G G G B B B B B B       G = 正确版本,B = 错误版本
 |       |       |
left    mid    right


bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        int left = 1;
        int right = n;
        while (left < right) 
        {
            int mid = left + (right - left) / 2;
            if (isBadVersion(mid)) 
                right = mid;
            else 
                left = mid + 1;
        }
        
        return left;
    }
};
数组中出现次数超过一半的数字
在排序数组中查找元素的第一个和最后一个位置
50. Pow(x, n)
153. 寻找旋转排序数组中的最小值
上一篇 下一篇

猜你喜欢

热点阅读