LeetCode 33. Search in Rotated Sorted Array

问题连接

LeetCode 33. Search in Rotated Sorted Arrayhtml

题目解析

给定一个 “升序”无重复 数组,从中寻找目标值。“升序”:旋转后的升序,例如 [4,5,1,2,3]。数组

时间限制:\(O(lgN)\)spa

解题思路

题目要求在 \(O(lgN)\) 时间内找到目标值,很容易想到二分法。若是是普通的升序,普通的二分便可解决问题。题目中提到的旋转后的升序,咱们不知道其“旋转点”在哪,那么有什么特色呢?以题目例子分析:code

对于普通升序数组[0,1,2,3,4,5,6,7],其旋转后可能状况有[1,2,3,4,5,6,7,0]、[2,3,4,5,6,7,0,1][3,4,5,6,7,0,1,2]、[4,5,6,7,0,1,2,3]、[5,6,7,0,1,2,3,4]、[6,7,0,1,2,3,4,5]、[7,0,1,2,3,4,5,6]七种状况。htm

二分法的关键在于取中间值后,与目标值比较,判断左半段仍是右半段。观察上述八种状况,能够发现以中间值为界,左右两部分总有一段是绝对升序的。当 nums[mid] < nums[right] 时,右半段绝对升序;当 nums[mid] > nums[right] 时,左半段绝对升序。blog

仔细想一想,这个规律很简单的,不须要证实。ip

旋转有序的特色已经找到了,咱们只须要判断目标值是否在绝对升序的范围内,就能够肯定二分的边界了。leetcode

参考代码

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

类似题目

LeetCode 81. Search in Rotated Sorted Array IIget


LeetCode All in One题解汇总(持续更新中...)博客

本文版权归做者AlvinZH和博客园全部,欢迎转载和商用,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利.

相关文章
相关标签/搜索