二分查找
给定一个排序的整数数组(升序)和一个要查找的整数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的表示范围,可以采取的改进思路是:
- 拆分array数组,使每个子数组的长度均小于2^32,每个子数组长度为size
- 将target与每个子数组的头尾比较,若存在target大于此数组头部且小于此数组尾部,则对此数组进行二分查找
来源:https://www.cnblogs.com/libaoquan/p/6984878.html