假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

思路

二分,根据mid将原问题分成有序和无序的两部分,然后判断target在那个地方,将问题进行二分。
如果在有序里就去掉无序的部分,如果在无序的部分就去掉有序的部分。

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        while (l <= r) {
            int mid = (r - l) / 2 + l;
            if (nums[mid] == target) return mid;
            else if (nums[mid] < nums[r]) {
                if (nums[mid] < target && target <= nums[r]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                } 
            } else {
                if (nums[mid] > target && target >= nums[l]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
                
            }
        }
        return -1;
    }
};

总结

这个东西一开始,我一脸懵逼,
后来看到别人说的,分为有序和无序的部分,我这才有点明白。
所以先找到哪一部分是有序的,然后决定怎么去掉那一部分。