1 題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。
2 分析及題解
直接min(rotateArray)的方法就不放了…
2.1 暴力遍歷法
從第一個元素開始遍歷,逐個對比,找出最小元素
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
minNum = rotateArray[0]
cur = 1
while cur < len(rotateArray):
if minNum > rotateArray[cur]:
minNum = rotateArray[cur]
return minNum #遞增旋轉,這裏可以提前結束
cur += 1
return minNum
2.2 二分法
需要扣住題目中的:非遞減數組,原數組或者是變化之後的旋轉數組
二分法中考慮三種情況,中間數等於左右指針所指之數的特殊情況,中間數大於右指針或小於右指針所指之數
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
pre = 0
cur = len(rotateArray) - 1
while cur - pre != 1:
mid = (pre + cur) // 2
if rotateArray[pre] == rotateArray[mid] == rotateArray[cur]: #考慮特殊情況eg:[1,0,1,1,1]
minNum = rotateArray[0]
for i in rotateArray[1:]:
if i < minNum:
minNum = i
return minNum
elif rotateArray[mid] >= rotateArray[cur]:#數組旋轉了,直接交換將mid賦值給pre
pre = mid
else:
cur = mid
return rotateArray[cur]