二分搜索

**區間縮小-> 剩下兩個下標->判斷兩個下標**

1. 這兩個下標根據先要end還是先要start先後順序會有不同。

2. 如果沒有target出現,令start = mid, end = mid不會影響結果。你只要讓問題的規模縮小即可。因爲start和end不管是否包括mid值都不影響最後的結果

**注:不要把縮小區間和得到答案放在一個循環裏面,容易出問題,增加難度**

給定一個排序的整數數組(升序)和一個要查找的整數target,用O(logn)的時間查找到target第一次出現的下標(從0開始),如果target不存在於數組中,返回-1

樣例

在數組 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2

這個題應該是Binary Search最基礎的題,直接套用模版就可以,以下是這個題的代碼(Bug Free):

複製代碼
    int binarySearch(vector<int> &array, int target) {
        if (!array.size()) return -1;
        int start = 0, end = array.size() - 1;
        while (start < end) {
            int mid = (start + end) >> 1;
            if (array[mid] < target) {
                start = mid + 1;
            } else if (array[mid] > target) {
                end = mid -1;
            } else {
                end = mid;
            }
        }
        if (array[start] == target) return start;
        return -1;
    }
複製代碼

 遞歸寫法:

1. 寫個helper

2. 把while循環相反的條件當成base case

3. 改座標變成了recursion函數裏面改座標

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章