leetcode专题训练 33. Search in Rotated Sorted Array

我看到这道题的时候想到了用二分,可是不知道怎么用,后来看题解说是先用二分找到pivot,再二分一次,觉得很巧妙。而且做这道题的时候需要注意特殊情况:

  1. 根本没有旋转。
  2. nums为空
  3. nums中只有一个元素

在没有旋转时nums[pivot] > nums[pivot + 1]这个条件是无法找到pivot的,而且还会使程序执行错误,所以需要用

if (nums[left] < nums[right]) { //有可能根本没有旋转
	pivot = right;
}

来判断出根本没有翻转的情况,来特殊处理。
最终的代码如下

class Solution {
private:
    static int BinarySearch(int left, int right, int target, vector<int>& nums)
    {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
public:
    int search(vector<int>& nums, int target) {
        int l = nums.size();
        if (l == 0) return -1;
        if (l == 1) return nums[0] == target ? 0 : -1;
        if (nums[0] == target) {
            return 0;
        }
        int result = -1;
        int left = 0;
        int right = l - 1;
        int pivot = -1;
        if (nums[left] < nums[right]) { //有可能根本没有旋转
            pivot = right;
        } else {
            while (left <= right) {
                pivot = (left + right) / 2;
                if (nums[pivot] > nums[pivot + 1]) {
                    break;
                }
                if (nums[pivot] >= nums[0]) {
                    left = pivot + 1;
                } else {
                    right = pivot - 1;
                }
            }
        }
        
        if (target > nums[0]) {
            result = BinarySearch(0, pivot, target, nums);
        } else {
            result = BinarySearch(pivot + 1, l - 1, target, nums);
        }
        return result;
    }
};
发布了201 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Ema1997/article/details/96204560