Skip to content

Latest commit

 

History

History
33 lines (33 loc) · 1.34 KB

search.md

File metadata and controls

33 lines (33 loc) · 1.34 KB

题目描述:
image
解题过程:
后知后觉发现要用二分法,一开始居然还想着寻找是在哪里发生的旋转然后再用二分法之类的,相当于两次使用二分法,很显然这样子的想法是错误的。
看了答案,居然可以用局部的二分法,因为旋转数组无论如何都有一边是有序的,所以可以根据中间值和第一个值的大小来判断从0到中间值的这段区间是否为升序的部分,然后就是常规的根据大小的比较结果进行区间的细化
代码:

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