題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
思路
緊扣題目字眼: 非遞減數組
- 可以爲遞增數組 如: [1,2,3,4,5]
- 也可以爲非遞減重複數組 如: [0,1,0,1,0,1]
對於遞增數組 如: [1,2,3,4,5] 旋轉後爲 [3,4,5,1,2],數組中間必然存在最大值,最大值後存在最小數字,所以找出最大值,就能確定最小值
對於非遞減重複數組,只需要遍歷數組,找出最小值即可
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
left = 0 # 第一指針 因爲輸入爲旋轉數組,開頭元素爲第一數組元素
right = len(rotateArray) - 1 # 第二指針 末尾元素 爲旋轉後數組元素
while left <= right:
# 不做此處理時間會超時
if (right - left) == 1: # 左右指針 相距爲1時
return rotateArray[right]
mid = (left + right) // 2 # 取中間下標
# 如果出現大量重複(例如:[1,0,1,1,1]),只能順序查找
if rotateArray[mid] == rotateArray[left] and rotateArray[mid] == rotateArray[right]:
res = rotateArray[left]
for i in range(left + 1, right + 1):
if res > rotateArray[i]:
res = rotateArray[i]
return res
# 中間元素位於前面遞增數組時,他會大於/等於第二指針指向元素,此時最小值應該位於中間指針後面,第一指針指向中間元素
if rotateArray[mid] >= rotateArray[left]:
left = mid
# 中間元素位於後面遞增數組時,他會小於/等於第二指針指向元素,最小元素位於中間元素前面,第二指針指向中間
elif rotateArray[mid] <= rotateArray[right]:
right = mid
return rotateArray[right]