前往
大廳
主題

LeetCode - 153. Find Minimum in Rotated Sorted Array 解題心得

Not In My Back Yard | 2022-02-13 00:00:01 | 巴幣 0 | 人氣 398

題目連結:


題目意譯:
假設現有一個長度為 n 且按升序排序之陣列被旋轉了 1 到 n 次。例如陣列 nums = [0,1,2,3,4,5,6,7] 可能變為:
[4,5,6,7,0,1,2] 如果它被旋轉了 4 次。
[0,1,2,4,5,6,7] 如果它被旋轉了 7 次。

注意旋轉一個陣列 [a[0], a[1], a[2], ……, a[n-1]] 一次將得到陣列 [a[n-1], a[0], a[1], a[2], ……, a[n-2]]。


給定已排序的、旋轉後的相異元素陣列 nums,回傳該陣列中最小的元素。

你必須寫出一個時間複雜度為 O(log n) 的演算法。

限制:
n == nums.length
1 ≦ n ≦ 5000
-5000 ≦ nums[i] ≦ 5000
nums 中所有整數皆相異。
nums 已排序且旋轉了 1 到 n 次。



範例測資:
範例 1:
輸入: nums = [3,4,5,1,2]
輸出: 1
解釋: 原始陣列為 [1,2,3,4,5] 且其被旋轉了 3 次。

範例 2:
輸入: nums = [4,5,6,7,0,1,2]
輸出: 0
解釋: 原始陣列為 [0,1,2,4,5,6,7] 且其被旋轉了 4 次。

範例 3:
輸入: nums = [11,13,15,17]
輸出: 11
解釋: 原始陣列為 [11,13,15,17] 且其被旋轉了 4 次。


解題思維:
稍作變化的二分搜尋法(Binary Search)。

可以觀察到原始陣列(或是旋轉 n 次後的陣列,其與原始陣列相同)的開頭元素將會小於結尾元素,即 nums[0] ≦ nums[n-1];而其他旋轉任意次數(只要不是恰好 n 次)後的陣列都會是開頭大於結尾,即 nums[0] > nums[n-1]。

因此我們可以定義兩個變數 L = 0 、 R = n - 1,然後重複以下步驟直到 L ≧ R 為止:
令 M = floor((L + R) ÷ 2),其中 floor() 為下高斯(對於正數而言等價於無條件捨去小數部分)。

接著判斷 nums[M] 與 nums[R] 之大小關係:
當 nums[M] > nums[R] 時,代表著 nums[L] ~ nums[M] 都會大於 nums[R],因此最小的元素應位於 [M + 1, R] 這個範圍。所以我們將 L 之值更新為 M + 1;

反之當 nums[M] ≦ nums[R] 時,代表著最小的元素應位於 [L, M] 這個範圍。所以我們將 R 之值更新為 M。



上述過程結束後,最後所求即為 nums[L]。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作