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和博客園全部,歡迎轉載和商用,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利.

相關文章
相關標籤/搜索