(python版)《劍指Offer》JZ06:旋轉陣列的最小數字
【思路1】本質就是求解陣列最小值
class Solution:
def minArray(self, numbers: List[int]) -> int:
return min(numbers)
【思路2】二分法
由於原始陣列是遞增,那麼旋轉之後,旋轉點左右的兩部分仍然是遞增的
這裡記原始陣列中旋轉點左側的陣列為 A,原始陣列中旋轉點右側的陣列為 B
旋轉之後有原來的 AB 變成了 BA
演算法流程:
- 初始化: 宣告 l, r雙指標分別指向 nums 陣列左右兩端;
- 迴圈二分
- 返回值: 當 l = r 時跳出二分迴圈,並返回 旋轉點的值 nums[l] 即可。
class Solution:
def minArray(self, numbers: List[int]) -> int:
l, r = 0, len(numbers) - 1
while l < r:
mid = (l + r) // 2
if numbers[mid] > numbers[r]:
# 說明mid在原來的 B 部分,l在mid基礎上 往前一步
l = mid + 1
elif numbers[mid] < numbers[r]:
# 說明mid在A部分,mid做為新的終點r
r = mid
else:
# 無法判斷 mm 在哪個排序陣列中,執行 r = r - 1j=j−1 縮小判斷範圍
r -= 1
return numbers[l]
'''
作者:LotusPanda
連結:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/xiong-mao-shua-ti-python3-er-fen-fa-by-lotuspanda/
來源:力扣(LeetCode)
'''
當 numbers[mid] = numbers[r], 一定有區間 [l, m]內所有元素相等 或 區間 [m, r] 內所有元素相等(或兩者皆滿足)。對於尋找此類陣列的最小值問題,可直接放棄二分查詢,而使用線性查詢替代。
即
else:
return min(numbers[i:j])
作者:Krahets
連結:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5055b1/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
補充思考: 為什麼本題二分法不用 nums[mid] 和 nums[l] 作比較?
-
二分目的是判斷 m 在哪個排序陣列中,從而縮小區間。而在 nums[mid] > nums[l] 情況下,無法判斷 m 在哪個排序陣列中。本質上是由於 j 初始值肯定在右排序陣列中; i 初始值無法確定在哪個排序陣列中。舉例如下:
對於以下兩示例,當 l = 0, r = 4, m = 2 時,有 nums[mid] > nums[l] ,而結果不同。
[1, 2, 3, 4 ,5] 旋轉點 x = 0 : m 在右排序陣列(此示例只有右排序陣列);
[3, 4, 5, 1 ,2] 旋轉點 x = 3 : m 在左排序陣列。連結:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5055b1/
相關文章
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 【劍指offer】旋轉陣列的最小值陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指offer面試題11:旋轉陣列的最小數字(Java版已在牛客網AC)面試題陣列Java
- 【劍指offer】把陣列排成最小的數陣列
- 0二分查詢簡單 牛客NC.71旋轉陣列的最小數字 leetcode劍指 Offer 11. 旋轉陣列的最小數字陣列LeetCode
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 力扣 - 劍指 Offer 45. 把陣列排成最小的數力扣陣列
- 劍指Offer--陣列中重複的數字陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 《劍指offer》:[38]數字在排序陣列中出現的次數排序陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 劍指offer之列印超過陣列一半的數字陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 劍指 offer(1) -- 陣列篇陣列
- 我請大家來刷題:旋轉陣列的最小數字陣列
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 《劍指offer》:[40]陣列中只出現一次的數字陣列
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 【劍指offer】陣列中只出現一次的數字(2)陣列
- 【劍指offer】陣列中的逆序對陣列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- [劍之offer] 03 陣列中重複的數字陣列
- 旋轉陣列中的最小元素陣列
- 劍指offer之順序列印陣列陣列
- 【劍指offer】調整陣列順序陣列