剑指offer11 旋转数组的最小数字

Posted fuj905

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer11 旋转数组的最小数字相关的知识,希望对你有一定的参考价值。

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
 

分析

1.从题目看就是一个有序数组分成AB,旋转后变为BA,找出A的第一个数值。for循环O(n)可以直接查,或者直接返回min

2.数组的查找优先使用二分法查找,定义mid,

mid若是大于high,则说明min现在在B里,low往右变为mid+1,至少是mid加一,因为现在mid还在B里;

mid若是小于high,则说明mid现在就在A里了,high往左移变为mid,不用减一,万一就是min了呢

mid若是等于high,无法判断mid在哪里,(3 2 2 2)但因为是非递减排序,执行high--

不断缩小范围后,low为现在最小的元素

 

解题

1.

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        if len(numbers) == 0:
            return 0
        # return min(numbers)
        for i in range(len(numbers)-1):
            if(numbers[i]>numbers[i+1]):
                return numbers[i+1]
        return numbers[0]

 

2.

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        if len(numbers) == 0:
            return 0
        i, j = 0, len(numbers) - 1
        while i < j:
            m = (i + j) // 2
            if numbers[m] > numbers[j]:
                i = m + 1
            elif numbers[m] < numbers[j]:
                j = m
            else:
                j -= 1
        return numbers[i]

 

 

以上是关于剑指offer11 旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:旋转数组的最小数字11

剑指 Offer 11. 旋转数组的最小数字暴力二分查找

LeetCode 剑指 Offer 11. 旋转数组的最小数字 | Python

剑指 Offer 11. 旋转数组的最小数字

双百解法剑指 Offer 11. 旋转数组的最小数字

#yyds干货盘点#剑指 Offer 11. 旋转数组的最小数字