一、題目以及解題方法:
題目:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。
解:找出轉折處的數字,因爲數組是遞增的,假如找到某一個點是突然遞減小,那個點就是要返回的元素。例如{3,4,5,1,2}3-5是遞增1-2是遞增,唯有1和5是有遞減關係。
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
for i in range(len(rotateArray)):
if rotateArray[i+1] < rotateArray[i]:
return rotateArray[i+1]
測試:
if __name__ == '__main__':
a = [3,4,5,1,2]
b = []
so = Solution()
print(so.minNumberInRotateArray(a))
print(so.minNumberInRotateArray(b))
結果:
1
0
Process finished with exit code 0
二、旋轉數組
這道題的初衷應該是把數組旋轉。怎麼旋轉一個數組?
方法一:直接對傳入列表拼接。
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
for i in range(len(rotateArray)):
if rotateArray[i+1] < rotateArray[i]:
return rotateArray[i+1:] + rotateArray[:i+1]
方法一測試:
if __name__ == '__main__':
a = [3,4,5,1,2]
so = Solution()
print(so.minNumberInRotateArray(a))
方法一結果:
[1, 2, 3, 4, 5]
0
Process finished with exit code 0
方法二:三反轉
- 把數組分成3,4,5反轉一次5,4,3。
- 剩下1,2反轉一次2,1。
- 合併爲(5,4,3,2,1)把整個數組再反轉一次(1,2,3,4,5)
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
for i in range(len(rotateArray)):
if rotateArray[i+1] < rotateArray[i]:
return list(reversed(list(reversed(rotateArray[:i+1]))+list(reversed(rotateArray[i+1:]))))
測試:
if __name__ == '__main__':
a = [3,4,5,1,2]
b = []
so = Solution()
print(so.minNumberInRotateArray(a))
print(so.minNumberInRotateArray(b))
結果:
[1, 2, 3, 4, 5]
0
Process finished with exit code 0
其實可以直接
return min(a)