153. Find Minimum in Rotated Sorted Array(旋轉數組的最小數字)(leetcode)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7]
might become [4,5,6,7,0,1,2]
).
Find the minimum element.
You may assume no duplicate exists in the array.
Example 1:
Input: [3,4,5,1,2] Output: 1
Example 2:
Input: [4,5,6,7,0,1,2] Output:0
分析:遇到查詢已排序數組第一個應該想到的方法應該是二分法,時間復雜度低,運算快。
二分法:正常版:
時間復雜度
二分查找也稱為折半查找,每次都能將查找區間減半,這種折半特性的算法時間復雜度為 O(logN)。
m 計算
有兩種計算中值 m 的方式:
- m = (l + h) / 2
- m = l + (h - l) / 2
l + h 可能出現加法溢出,最好使用第二種方式。
返回值
循環退出時如果仍然沒有查找到 key,那麽表示查找失敗。可以有兩種返回值:
- -1:以一個錯誤碼表示沒有查找到 key
- l:將 key 插入到 nums 中的正確位置
變種
二分查找可以有很多變種,變種實現要註意邊界值的判斷。例如在一個有重復元素的數組中查找 key 的最左位置的實現如下:
該實現和正常實現有以下不同:
- 循環條件為 l < h
- h 的賦值表達式為 h = m
- 最後返回 l 而不是 -1
這道題和昨天的278. First Bad Version (Easy)都用了變種的方式。
本題解法:
分析:最小值的位置有三種可能:最小值在中間,最小值在左邊,最小值在右邊。如果中間值<右邊的值。則最小值在中間或左邊,反之,在右邊。知道規律後就好寫了。
4 5 1 2 3
5 1 2 3 4
3 4 5 1 2
時間復雜度:o(logn) 空間復雜度:o(1)
什麽時候用變種什麽時候用正常解法呢?
一般來講,已知目標數,查找與目標數相關內容,則用正常版,
如果需要自己確定目標數,一般通過巧妙設置low,mid,high的值用變種解法做。
153. Find Minimum in Rotated Sorted Array(旋轉數組的最小數字)(leetcode)