lintcode-14-二分查找

二分查找

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。

样例

在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。

挑战

如果数组中的整数个数超过了2^32,你的算法是否会出错?

标签

二分法 数组

说明

普通的二分查找,数组中整数超过2^32会导致算法出错。

code

class Solution {
public:
    /**
     * @param nums: The integer array.
     * @param target: Target number to find.
     * @return: The first position of target. Position starts from 0. 
     */
    int binarySearch(vector<int> &array, int target) {
        // write your code here
        int size = array.size();
        int low = 0, high = size-1, mid = (high + low) / 2;
        int find = -1;

        if(array[low]>target || array[high]<target) {  
            return -1;  
        }

        while(low <= high) {
            if(array[mid] == target) {
                find = mid;
                break;
            }
            else if(array[mid] < target)
                low = mid + 1;
            else
                high = mid - 1;

            mid = (high + low) / 2;
        }

        while(find > 0) {
            if(array[find-1] == target)
                find--;
            else
                break;
        }

        return find;
    }
};

改进思路

若数组长度大于2^32,则low, mid, high三个数组下标均有可能超出int的表示范围,可以采取的改进思路是:

  1. 拆分array数组,使每个子数组的长度均小于2^32,每个子数组长度为size
  2. 将target与每个子数组的头尾比较,若存在target大于此数组头部且小于此数组尾部,则对此数组进行二分查找
posted @ 2017-06-11 12:49  LiBaoquan  阅读(773)  评论(0编辑  收藏  举报