LintCode-14. 二分查詢
阿新 • • 發佈:2019-01-29
題目描述
給定一個排序的整數陣列(升序)和一個要查詢的整數target,用O(logn)的時間查詢到target第一次出現的下標(從0開始),如果target不存在於陣列中,返回-1。
樣例
在陣列 [1, 2, 3, 3, 4, 5, 10] 中二分查詢3,返回2。
挑戰
如果陣列中的整數個數超過了2^32,你的演算法是否會出錯?
分析
根據題目描述可以很明確的知道本題是要用到二分法,不過是需要找到第一次出現的下標且時間複雜度要為O(logn)。
程式碼
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 low = 0, high = array.size() - 1;
while (low <= high) {
int mid = low + (high - low)/2;
if(array[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
if(array[low] == target) {
return low;
} else {
return -1;
}
}
};
優化
對於挑戰中提到的問題,個人認為可以用到指標指向首尾,然後向中間移動知道兩個指標相遇這就是中間的位置了。到網上查有人說可以將array拆成一個個小陣列。
總結
在win32下,int的範圍是 -
231 ~231 - 1,即-2147483648~2147483647.