劍指向Offer-Python版 -- 旋轉數組的最小數字

題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章