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