1. 程式人生 > >LintCode-14. 二分查詢

LintCode-14. 二分查詢

題目描述

給定一個排序的整數陣列(升序)和一個要查詢的整數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.