1. 程式人生 > >153. Find Minimum in Rotated Sorted Array(旋轉數組的最小數字)(leetcode)

153. Find Minimum in Rotated Sorted Array(旋轉數組的最小數字)(leetcode)

sorted order 最小數 技術 變種 and 分法 目標 asc

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)