1. 程式人生 > >劍指offer Python版 - 旋轉陣列的最小數字

劍指offer Python版 - 旋轉陣列的最小數字

題目描述

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

方法1:

使用Python內建函式min(),直接尋找最小元素。
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if rotateArray == []:
            return 0
        return min(rotateArray)

執行時間:1042ms

佔用記憶體:5760k


方法2:

觀察旋轉後的陣列,可以將陣列分為兩個排序的子陣列,前面子陣列的元素均大於後面子陣列的元素,而最小元素剛好是兩個子陣列的分界線。遍歷陣列中的元素,若前一個元素比後一個大,則後一個元素就是最小元素,如果不存在,則說明第一個元素就是最小。
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if rotateArray == []:
            return 0
        for i in range(len(rotateArray) - 1):
            if rotateArray[i] > rotateArray[i + 1]:
                return rotateArray[i + 1]
        return rotateArray[0]

執行時間:854ms

佔用記憶體:5736k


方法3:

二分查詢法。

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        left, right = 0, len(rotateArray) - 1
        while right - left > 1:
            mid = (left + right) // 2
            if rotateArray[mid] >= rotateArray[left]:
                left = mid
            if rotateArray[mid] <= rotateArray[right]:
                right = mid
        return rotateArray[right]

執行時間:1050ms

佔用記憶體:5732k