旋转数组的最小数字【刷题记录】

导读:本篇文章讲解 旋转数组的最小数字【刷题记录】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

标题旋转数组的最小数字

一、题目描述

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

示例:

输入:[3,4,5,1,2]
返回值:1

二、解题思路及python代码:
(一)暴力法
主要通过对数组遍历获取最小值(不推荐

算法流程:
1、特殊情况:如果数组为空,则直接返回0
2、遍历数组每一个元素num,遍历结束后直接返回 min

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray) == 0:
            return 0
        else:
            return min(rotateArray)

(二)二分查找法
排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别

算法流程:
1、初始化: 声明 i, j 双指针分别指向 array 数组左右两端
2、循环二分: 设 m = (i + j) / 2为每次二分的中点( “/” 代表向下取整除法,因此恒有 i≤m
(1)当 array[m] > array[j] 时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m + 1, j] 闭区间内,因此执行 i = m + 1
(2)当 array[m] < array[j] 时: m 一定在 右排序数组 中,即旋转点 x 一定在[i, m]闭区间内,因此执行 j = m
(3)当 array[m] = array[j] 时: 无法判断 m在哪个排序数组中,即无法判断旋转点 x 在 [i, m] 还是 [m + 1, j] 区间中。解决方案: 执行 j = j – 1 缩小判断范围
3、返回值: 当 i = j 时跳出二分循环,并返回 旋转点的值 array[i] 即可。
在这里插入图片描述

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        # 特殊情况判断
        if len(rotateArray) == 0:
            return 0
        # 左右指针
        i, j = 0, len(rotateArray) - 1
        while i < j:
            # 确定中点索引
            m = (i + j) // 2
            # m在左排序数组中,旋转点在 [m+1, j]if rotateArray[m] > rotateArray[j]:
                i = m + 1
            # m在右排序数组中,旋转点在 [i, m] 中
            elif rotateArray[m] < rotateArray[j]:
                j = m
            #若rotateArray[m]=rotateArray[j]无法判断 m在哪个排序数组中,执行 j = j - 1 ,缩小判断范围 
            else:
                j -= 1
        # 返回结果
        return rotateArray[i]

复杂度分析:
时间复杂度O(logN):N表示数组的长度,二分查找O(logN)
空间复杂度O(1):仅使用常数(i, j, m)额外空间变量O(1)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99777.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!