33. Search in Rotated Sorted Array
題目網址: https://leetcode.cn/problems/search-in-rotated-sorted-array/
題意: 有一整數 array
nums
按升序排列, 其中的值互不相同。給一旋轉後的 array
nums
和一整數target
, 如果nums
中存在target
, 則返回其 index; 否則, 返回-1
。請設計 $O(log(n))$ time 的演算法。
Solution:
想法:利用 Binary Search, 將
nums
從中間分開成左右兩部分的時候, 一定有一部分是有序的。e.g.
nums = [4,5,6,7,0,1,2]
, 從6
切割, 可分成[4,5,6]
和[7,0,1,2]
兩個部分, 其中左邊[4,5,6]
是有序的因此我們可以在 Binary Search 時查看當前
mid
分割的兩個部分[left, mid]
和[mid + 1, right]
中哪個是有序的, 藉此來縮小左邊界 or 右邊界。
- 若
target == nums[mid]
, 則直接返回mid
- 若
[left, mid]
是有序的, 且target
界於[nums[left], nums[mid])
間, 則縮小搜索範圍為[left, mid - 1]
; 否則, 縮小搜索範圍為[mid + 1, right]
- 若
[mid + 1, right]
是有序的, 且target
界於(nums[mid], nums[right]]
間, 則縮小搜索範圍為[mid + 1, right]
; 否則, 縮小搜索範圍為[left, mid - 1]
當
[left, mid]
區間恰好只有一個元素時, 也滿足左半邊已排序的定義e.g.
nums = [3, 1]
,target = 1
left = 0
,right = 1
,mid = 0
➔[left, mid]
區間恰好只有一個元素, 使得nums[left] == nums[mid]
, 這時target
應跟左半邊中的元素比較, 然後才縮小邊界
class Solution { |
- time:$O(log(n))$ ➔ Binary search
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論