程序員面試金典 10.3

Search in Rotated Array:在一個經過多次旋轉的有序數組中查找一個元素的位置,如果有多個,返回索引最小的位置。

書上也沒說旋轉是什麼意思,翻了半天題解看懂了什麼是旋轉,也就是把數組中最開始的若干個元素移動到末尾。

根據旋轉的定義可知,多次旋轉和一次旋轉是等價的情況,最終的數組必定會被分成遞增的兩部分,所以可以使用二分法。

比較麻煩的是處理邊界條件。只有beginmid是嚴格遞增的,且target落在該區間中,則可以完全排除右半區間,其餘情況爲了代碼的簡潔性,索性就左右區間全部搜索吧。

搞這麼複雜,就是因爲要返回最左邊的,否則按照書上的寫就行了。

class Solution {
public:
    int search(vector<int>& arr, int target) {
        return search(arr, target, 0, arr.size());
    }
private:
    int search(const vector<int> &arr, int target, int begin, int end)
    {
        int mid = begin + (end - begin) / 2, ret;
        if(begin == end) return -1;
        if(arr[begin] < arr[mid]){
            if(target >= arr[begin] && target <= arr[mid]){
                ret = search(arr, target, begin, mid);
                if(ret != -1) return ret;
                else if(arr[mid] == target) return mid;
                else return -1;
            }
            else return search(arr, target, mid + 1, end);
        }
        else{
            ret = search(arr, target, begin, mid);
            if(ret != -1) return ret;
            else if(arr[mid] == target) return mid;
            else return search(arr, target, mid + 1, end);
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章