程序员面试金典 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);
        }
    }
};
发布了194 篇原创文章 · 获赞 2 · 访问量 7705

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/105522923
今日推荐