《劍指offer》第6題:旋轉數組的最小數字

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