• 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大于此数组头部且小于此数组尾部,则对此数组进行二分查找
  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/libaoquan/p/6984878.html
Copyright © 2020-2023  润新知