題目描述:已知一個(gè)長(zhǎng)度為 n 的數(shù)組表锻,預(yù)先按照升序排列,經(jīng)由 1 到 n 次 旋轉(zhuǎn) 后乞娄,得到輸入數(shù)組瞬逊。例如,原數(shù)組 nums = [0,1,2,4,5,6,7] 在變化后可能得到:
- 若旋轉(zhuǎn) 4 次确镊,則可以得到 [4,5,6,7,0,1,2]
- 若旋轉(zhuǎn) 7 次范删,則可以得到 [0,1,2,4,5,6,7]
注意蕾域,數(shù)組 [a[0], a[1], a[2], ..., a[n-1]] 旋轉(zhuǎn)一次 的結(jié)果為數(shù)組 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。給你一個(gè)元素值 互不相同 的數(shù)組 nums 到旦,它原來是一個(gè)升序排列的數(shù)組旨巷,并按上述情形進(jìn)行了多次旋轉(zhuǎn)。請(qǐng)你找出并返回?cái)?shù)組中的 最小元素 采呐。
示例:
例1
輸入:nums = [3,4,5,1,2]
輸出:1
解釋:原數(shù)組為 [1,2,3,4,5] ,旋轉(zhuǎn) 3 次得到輸入數(shù)組斧吐。
例2
輸入:nums = [4,5,6,7,0,1,2]
輸出:0
解釋:原數(shù)組為 [0,1,2,4,5,6,7] 仲器,旋轉(zhuǎn) 4 次得到輸入數(shù)組。
例3
輸入:nums = [11,13,15,17]
輸出:11
解釋:原數(shù)組為 [11,13,15,17] 乏冀,旋轉(zhuǎn) 4 次得到輸入數(shù)組。
提示:
- n == nums.length
- 1 <= n <= 5000
- -5000 <= nums[i] <= 5000
- nums 中的所有整數(shù) 互不相同
- nums 原來是一個(gè)升序排序的數(shù)組煤辨,并進(jìn)行了 1 至 n 次旋轉(zhuǎn)
解題思路:旋轉(zhuǎn)之后分以下三種情況
- 旋轉(zhuǎn)后還是原數(shù)組,依然是一個(gè)升序數(shù)組端三,最小值就是第一個(gè)元素
- 旋轉(zhuǎn)后是一個(gè)降序數(shù)組鹃彻,最小值是最后一個(gè)元素
-
最小元素在數(shù)組中某個(gè)位置,如下圖
-
第三種情況又分兩種情況
情況一:nums[mid]<nums[r]。如下圖所示育拨,這說明 nums[mid] 是最小值右側(cè)的元素欢摄,因此我們可以忽略二分查找區(qū)間的右半部分
情況二:nums[mid]>nums[r]。如下圖所示怀挠,這說明 nums[mid] 是最小值左側(cè)的元素,因此我們可以忽略二分查找區(qū)間的左半部分闷畸。
解題語言: Swift
static func findMin(_ nums: [Int]) -> Int {
var l = 0, r = nums.count - 1
while l < r {
let mid = (l + r) / 2
if (nums[mid] > nums[r]) {
l = mid + 1
} else {
r = mid
}
}
return nums[l]
}