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