[python 刷题] 153 Find Minimum in Rotated Sorted Array

news2024/11/30 6:56:06

[python 刷题] 153 Find Minimum in Rotated Sorted Array

题目:

Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:

  • [4,5,6,7,0,1,2] if it was rotated 4 times.
  • [0,1,2,4,5,6,7] if it was rotated 7 times.

Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]] 1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]].

Given the sorted rotated array nums of unique elements, return the minimum element of this array.

You must write an algorithm that runs in O(log n) time.

一般来说,O(log n) time 是一个比较好的二分算法指向,这道题也是一个二分算法的经典题

这里假设没有被操作过的数组是排好序,每次进行旋转,都会将 list[-1] 移到 list[0],如题目中给的案例 [0,1,2,4,5,6,7],旋转过程为:

  • r = 1

    在这里插入图片描述

    [7,0,1,2,4,5,6]

  • r = 2

    重复该过程:

    [6,7,0,1,2,4,5]

  • r = 3

    [5,6,7,0,1,2,4]

  • r = 4

    如题目所示:[4,5,6,7,0,1,2]

题目给的 input 是已经旋转好的数组,如:nums = [3,4,5,1,2],让找到数组中最小的数字,也就是找到未被旋转的数组中的 l[0]

可以注意到,旋转后的数组还是有规律的:

  • 如果完成了 n 次旋转,即 n = l e n ( n u m s ) n = len(nums) n=len(nums),那么数组其实就是还原成排好序的数组,这个时候的规律为:

    l [ 0 ] < l [ 1 ] < . . . < l [ n − 1 ] l[0] < l[1] < ... < l[n-1] l[0]<l[1]<...<l[n1]

    换言之, l [ 0 ] l[0] l[0] 就是最小的数字

  • 每次旋转都是将数组尾部的数字忘数组头部移动,因此,可以总结出:

    数组中存在一个下标 p p p,满足条件 l [ 0 ] < l [ 1 ] < l [ 2 ] < . . . < l [ p ] l[0] < l[1] < l[2] < ... < l[p] l[0]<l[1]<l[2]<...<l[p],且满足 l [ p ] > l [ p + 1 ] l[p] > l[p+1] l[p]>l[p+1] l [ p + 1 ] < l [ p + 2 ] < . . . < l [ n − 1 ] l[p+1] < l[p+2] < ... < l[n-1] l[p+1]<l[p+2]<...<l[n1] l [ n − 1 ] < l [ 0 ] l[n-1] < l[0] l[n1]<l[0] 这个条件

    也就是说该数组中存在两个递增数组 l 1 ′ l'_1 l1 l 2 ′ l'_2 l2 l 1 ′ l'_1 l1 的最后一个数字比 l 2 ′ l'_2 l2 的第最后一个数字大,而 l 2 ′ l'_2 l2 的第一个数字就是整个数组的最小值

以案例 nums = [3,4,5,1,2] 来说,只要找到一个点 p p p,满足 l [ p + 1 ] < 2 < l [ p ] l[p+1] < 2 < l[p] l[p+1]<2<l[p] 即可。因为 l 1 ′ l'_1 l1 l 2 ′ l'_2 l2 都是递增数组,所以这道题可以用二分算法:

  • l 1 ′ l'_1 l1 中的值一定比 l 2 ′ l'_2 l2 的最后一个数字大
  • l 2 ′ l'_2 l2 中的值一定小于等于 l 2 ′ l'_2 l2 的最后一个数字
class Solution:
    def findMin(self, nums: List[int]) -> int:
        # if the array has been rotated without restore
        # nums[-1] will be smaller than n[0]
        # if n[-1] >= n[0], then it's in sorted
        # some edge cases:
        if nums[-1] >= nums[0]:
            return nums[0]
        if len(nums) == 2:
            return min(nums)
        if nums[-1] < nums[-2]:
            return nums[-1]

        # find the position p, where n[p] < n[-1] < n[p - 1]
        l, r = 0, len(nums) - 1
        target = nums[-1]
        while l <= r:
            m = (l + r) // 2
            if target < nums[m - 1] and target > nums[m]:
                return nums[m]

            if target < nums[m]:
                l = m + 1
            else:
                r = m - 1
        return -1

这个写法能过,并且我个人觉得虽然因为为了找最小数字手动 cover 了一些 edge cases 乱一些,不过理清思路什么的方便一些,个人留着用来推出干净写法

下面是找的别人的干净写法:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        start , end = 0, len(nums) - 1
        curr_min = float("inf")

        while start  <  end :
            mid = (start + end ) // 2
            curr_min = min(curr_min,nums[mid])

            # right has the min
            if nums[mid] > nums[end]:
                start = mid + 1

            # left has the  min
            else:
                end = mid - 1

        return min(curr_min,nums[start])

这里就只是找 min,不用特别在意一些 edge case

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

年度顶级赛事来袭:2023 CCF大数据与计算智能大赛首批赛题上线!

久等了&#xff01; 大数据与人工智能领域年度顶级盛事——2023 CCF大数据与计算智能大赛——首批赛题已上线&#xff0c;大赛火力全开&#xff0c;只等你来挑战&#xff01; 大赛介绍 CCF大数据与计算智能大赛&#xff08;CCF Big Data & Computing Intelligence Contes…

嵌入式Linux应用开发-第十二章设备树的改造

嵌入式Linux应用开发-第十二章设备树的改造 第十二章 LED模板驱动程序的改造&#xff1a;设备树12.1 总结3种写驱动程序的方法12.2 怎么使用设备树写驱动程序12.2.1 设备树节点要与platform_driver能匹配12.2.2 设备树节点指定资源&#xff0c;platform_driver获得资源 12.3 开…

基于vue+Element Table Popover 弹出框内置表格的封装

文章目录 项目场景&#xff1a;实现效果认识组件代码效果分析 封装&#xff1a;代码封装思路页面中使用 项目场景&#xff1a; 在选择数据的时候需要在已选择的数据中对比选择&#xff0c;具体就是点击一个按钮&#xff0c;弹出一个小的弹出框&#xff0c;但不像对话框那样还需…

第79步 时间序列建模实战:支持向量机回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍支持向量机&#xff08;SVM&#xff09;回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemor…

Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)

一、命令行提示符格式内容因shell类型而异 Linux终端命令行提示符内容格式则因shell的类型而异&#xff0c;例如CoreLinux默认的shell是sh&#xff0c;其命令行提示符为黑底白字&#xff0c;内容为&#xff1a; tcbox:/$ 其中&#xff0c;tc为当前用户名&#xff0c;box为主机…

CSP-J第二轮试题-2021年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 分糖果题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2-优化 [CSP-J 2021] 插入排序题目描述输入格式输出格式样例 #1样例输入 #1样…

趣解设计模式之《小王的披萨店续集》

〇、小故事 在《小王的披萨店》这篇文章中&#xff0c;我们介绍了小王开披萨店的故事&#xff0c;并且为了解决多种口味披萨的扩展问题&#xff0c;引出了简单工厂和工厂方法模式。但是&#xff0c;故事仍在继续&#xff0c;如果芝加哥的披萨店和纽约的披萨店&#xff0c;要求…

T8161B T8403 T8448 ICS TRIPLEX 具有支持物联网边缘的计算机视觉

T8161B T8403 T8448 ICS TRIPLEX 具有支持物联网边缘的计算机视觉 edge Xpert(1.8版)现在提供了一个用于计算机视觉的插件&#xff0c;使用户能够在边缘运行他们的人工智能算法和视觉模型。基于英特尔的OpenVINO工具包&#xff0c;Edge Xpert计算机视觉服务为用户提供了在现…

「大数据-2.2」使用命令操作HDFS文件系统

目录 一、HDFS文件系统基本信息 1. HDFS的路径表达形式 2.HDFS和Linux的根目录的区分 二、 使用命令操作HDFS文件系统 0. Hadoop的两套命令体系 1. 创建文件夹 2. 查看指定目录下内容 3. 上传文件到HDFS指定目录下 4. 查看HDFS文件内容 5. 下载HDFS文件 6. 拷贝HDFS文件 7.…

快速幂算法-python

看了大神讲解&#xff0c;理论在这里&#xff1a;快速幂算法&#xff08;全网最详细地带你从零开始一步一步优化&#xff09;-CSDN博客 例题&#xff1a;求整数 base 的 整数 power 次方&#xff0c;对整数 num_mod 取幂。 python 代码如下&#xff1a; import timedef norm…

经历网 微信二维码 制作方法

1、谷歌浏览器&#xff0c;打开要制作微信二维码的 网站页面 2、点击页面空白处&#xff08;此步为了使鼠标激活页面&#xff0c;可省&#xff09;&#xff0c;点击鼠标右键&#xff0c;弹窗 点选 为此页面创建二维码&#xff0c;点击下载到自己指定的地方。完成。 下载下来的…

小黑子的java项目开发理解

小黑子的理解 一、基于Maven模板构建的三种常见Java项目——基于maven二、通常的java目录结构utils层 工具包model层&#xff08;pojo层&#xff09;exceptions层 报错包dao层&#xff08;mapper层&#xff09;[impl包—查询数据库]service层 定义接口 [impl—实现事务]control…

Docker-Windows安装使用

1.下载docker https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2.配置虚拟化环境 通过控制面板“设置”启用 Hyper-V 角色 右键单击 Windows 按钮并选择“应用和功能”。选择相关设置下右侧的“程序和功能”。选择“打开或关闭 Windows 功能”。选择“Hyper-…

Ubuntu性能分析-ftrace 底层驱动

1、框架介绍 ftrace内核驱动可以分为几部分:ftrace framework,RingBuffer,debugfs,Tracepoint,各种Tracer。 ftrace框架是整个ftrace功能的纽带,包括对内和的修改,Tracer的注册,RingBuffer的控制等等。 RingBuffer是静态动态ftrace的载体。 debugfs则提供了用户空间…

【李沐深度学习笔记】Softmax回归

课程地址和说明 Softmax回归p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 Softmax回归 虽然它名字叫作回归&#xff0c;但是它其实是分类问题 本节课的基础 想要学会本节课得需要一点基础&#xff0c…

day9.30

消息队列实现进程之间通信方式代码&#xff0c;现象 #include<myhead.h>//消息结构体 typedef struct {long msgtype; char data[1024]; }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) int main(int argc, const char *argv[]) {//1、创建key值…

安全渗透测试基础之-Nessus漏洞扫描工具(安装下载)

【注:本文中所需软件请回复公众号后获取,有任何问题请留言,看到会第一时间回复,毕竟我有自己的工作,分享经验并不是主业,不能时刻关注到。如果您觉得我写的好,请记得将公众号设为星标公众号,否则下次可能找不到。先谢谢各位愿意努力奋斗的小伙伴们了。】 本篇是安装下…

UML学习笔记

前言 UML&#xff08;Unified Modeling Language&#xff09;是一种对软件密集系统进行可视化建模的一种语言。有了图后来就可以一目了然。 C中有好多继承图&#xff0c;我都看不懂&#xff0c;所以就来学习一波&#xff5e; -代表私有&#xff08;private&#xff09;的表示…

经典网络解(三) 生成模型VAE | 自编码器、变分自编码器|有监督,无监督

文章目录 1 有监督与无监督2 生成模型2.1 重要思路 3 VAE编码器怎么单独用&#xff1f;解码器怎么单独用&#xff1f;为什么要用变分变分自编码器推导高斯混合模型 4 代码实现 之前我们的很多网络都是有监督的 生成网络都是无监督的&#xff08;本质就是密度估计&#xff09;&a…

5、Linux驱动开发:设备-设备注册

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…