《剑指offer》第6题:旋转数组的最小数字

旋转数组的最小数字

  • 1 题目描述
  • 2 分析及题解
    • 2.1 暴力遍历法
    • 2.2 二分法

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]

你可能感兴趣的:(数据结构与算法)