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);
}
}
};