Search in Rotated Array:在一個經過多次旋轉的有序數組中查找一個元素的位置,如果有多個,返回索引最小的位置。
書上也沒說旋轉是什麼意思,翻了半天題解看懂了什麼是旋轉,也就是把數組中最開始的若干個元素移動到末尾。
根據旋轉的定義可知,多次旋轉和一次旋轉是等價的情況,最終的數組必定會被分成遞增的兩部分,所以可以使用二分法。
比較麻煩的是處理邊界條件。只有begin
到mid
是嚴格遞增的,且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);
}
}
};