【劍指offer】旋轉數組的最小元素

一、題目以及解題方法:

題目:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{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

方法二:三反轉

  1. 把數組分成3,4,5反轉一次5,4,3。
  2. 剩下1,2反轉一次2,1。
  3. 合併爲(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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章