【每日一题】154. 寻找旋转排序数组中的最小值 II

news2024/11/27 13:44:51

154. 寻找旋转排序数组中的最小值 II - 力扣(LeetCode)

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]
  • 若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须尽可能减少整个过程的操作步骤。

示例 1:

输入:nums = [1,3,5]
输出:1

示例 2:

输入:nums = [2,2,2,0,1]
输出:0

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
class Solution {
    public int findMin(int[] nums) {
        //暴力解题
        // int len = nums.length;
        // int ans = nums[0];
        // for(int i = 1 ;i < len ; i++) {
        //     if(nums[i] < ans) {
        //         ans = nums[i];
        //     }
        // }
        // return ans;

        int left = 0;
        int right = nums.length - 1;
        while(left < right) {
            int mid = (left+right) / 2;
            if(nums[mid] < nums[right]) right = mid;
            else if(nums[mid] > nums[right]) left = mid+1;
            else right--;
        }
        return nums[left];
    }
}

        每日一题,今天是困难题。这道题目考察的二分很有意思。

        读完题目,发现这道题就是让我们去寻找最小值。那最暴力的方法也就是O(n)的方法,直接循环一次数组就可以得到最小值了。

        二分的方法怎么做呢?题目这里是会旋转数组的,也就是说,不知道数组会怎么样被选择,但,不论怎么旋转其实都可以知道有一个断点(当然,前后必须是连起来的,也就是0下标的前面对应的是nums.length-1下标的数)。这里用left,right来记录左右边界。由于一开始是升序的数组,那么一定可以知道right下标对应的数是断点之后最大的数。我们分情况来看。

        1.有旋转,且旋转没有刚好复原

        这种情况下,断点一定在数组中间,至少不会在边界0和 len-1的地方,那么这时候lerft所指向的数一定是大于等于right的,因为原数组是递增的。这时候的中点由于在中间,有3种情况:

        (1)如果nums[mid]>nums[right]说明,mid所在的位置,一定在断点之前。因为nums[left]都大于等于nums[right]了,nums[mid]又大于nums[right],所以这时候说明mid左边都还是递增的。由于大于nums[right],说明mid的左边不可能有比right小的,所以left = mid+1。

        (2)如果nums[mid]<nums[right]说明,mid所在的位置,由于小于nums[right],一定在断点之后。因为nums[right]是断点之后最大的,而nums[left]又大于等于right,所以说明此时mid的右边是都是递增的,还没有到达断点。right = mid。

        (3)如果nums[mid] == nums[right]有可能自mid之后都是nums[right]的值,也就是一条直线,这时候要往后退一个位置。因为即使退一个位置,right的值也不会变,而mid的值却可以往后退1位,就可以再进行判断。如果这时候直接让right=mid,有可能错过断点的位置。

       2.顺序

        顺序的话其实right就是最大的,会一直往左边退,直到退到0的位置。

        3.逆序

        逆序实际上right是最小的,会一直往右边进,直到right的位置。

        这道题目对二分的理解很有帮助。

 

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

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

相关文章

指数渐变线

指数渐变线是非均匀传输线的一种。为何叫指数渐变线呢&#xff1f;其分布参数变化规律为指数规律&#xff0c;比如&#xff1a;单位长度的电感、电容、特性阻抗。 1、分析过程 从非均匀线的微分方程出发&#xff1a; 对方程两侧同时取微分&#xff1a; 化简得&#xff1a; …

Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理

Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理 文章目录 Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理写在本文开始之前....1. 到底什么是虚拟内存地址2. 为什么要使用虚拟地址访问内存3. 进程虚拟内存空间4\. Linux 进程虚拟内存空间4.1 32 位机器上进程虚拟内…

【Java 基础篇】Properties 结合集合类的使用详解

Java 中的 Properties 类是一个常见的用于管理配置信息的工具&#xff0c;它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件&#xff0c;但它实际上也可以作为通用的 Map 集合来使用。在本文中&#xff0c;我们将详细探讨如何使用 Properties 作为 Map 集…

逼自己看完,Redis的事务你就掌握了!!!

目录 1、对于事务的理解 1.1、回顾MySQL的事务 1.2、Redis的事务 2、事务命令使用 3、watch的实现原理 3.1、watch用来干什么的&#xff1f; 3.2、watch的实现原理 1、对于事务的理解 1.1、回顾MySQL的事务 在MySQL中&#xff0c;事务有4个特性&#xff1a; 原子性&a…

无人机航测没信号?北斗卫星来解决

无人机航测是利用无人机进行地理信息的采集和处理的航测方式。相比传统的航测手段&#xff0c;无人机航测具备更高的灵活性、更低的成本和更广阔的适应性。无人机航测可以应用于土地测绘、农业植保、城市规划、自然资源调查等多个领域&#xff0c;极大地提高了测绘的效率和准确…

【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)

文章目录 创建环境创建专用网络VPC安全组创建云服务器打包部署2. Java环境启动项目开机启动任意服务1. 制作服务文件2. 制作启动脚本3. 制作停止脚本4. 增加执行权限5. 设置开机启动 创建镜像继续创建多台云服务器负载均衡弹性伸缩redis的报警规则白名单1. LAMP 环境1. 安装Apa…

Leetcode每日一题:打家劫舍系列Ⅰ、Ⅱ、Ⅲ、Ⅳ(2023.9.16~2023.9.19 C++)

由于之前写过打家劫舍系列&#xff0c;这里直接弄个合集&#xff0c;后面应该还有个iv。 目录 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III 2560. 打家劫舍 IV 198. 打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都…

详解TCP/IP协议第四篇:数据在网络中传输方式的分类概述

文章目录 前言 一&#xff1a;面向有连接型与面向无连接型 1&#xff1a;大致概念 2&#xff1a;面向有连接型 3&#xff1a;面向无连接型 二&#xff1a;电路交换与分组交换 1&#xff1a;分组交换概念 2&#xff1a;分组交交换过程 三&#xff1a;根据接收端数量分…

植物大战僵尸各种僵尸攻略(四)

前言 此文章为“植物大战僵尸”专栏中的011刊&#xff08;2023年9月第十刊&#xff09;&#xff0c;欢迎订阅。版权所有。 注意&#xff1a; 1.本博客适用于pvz无名版&#xff1b; 2.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)&#xff1b; 3.本文以耗费低做标准&am…

微信可以定时发朋友圈吗?

你可以使用微信管理系统来自动发布朋友圈&#xff0c;并且可以设置定时发送。这样你就不用守着手机担心朋友圈忘发漏发了&#xff0c;也不会错过发圈的好时间。 功能介绍 01 ​支持一键多号发布&#xff0c;可以进行转发、重发和二次编辑等操作。 02 选择想要发送的时间&…

c语言进阶部分详解(指针进阶1)

大家好&#xff01;指针的初阶内容我已经写好&#xff0c;可移步至我的文章&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述&#xff0c;直接带大家进入进阶内容&#xff1a; 目录 一.字符指针 1.讲解…

Python py文件打包成 exe文件

文章目录 安装 pyinstaller 模块pyinstaller 的使用pyinstaller 常用参数多文件打包 安装 pyinstaller 模块 pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple在 pyinstaller 模块安装成功之后&#xff0c;在 Python 的安装目录下的 Scripts 目录下会增加…

华为云云耀云服务器L实例评测|用PHP从数据库到后端到前端完整实现一个中秋节祝福语项目

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

小程序隐私弹窗的实现

小程序的开发者对于微信官方来说是有爱有恨&#xff0c;三天二头整事是鹅厂的一贯风格。 隐私弹窗的几个要点 回归正题&#xff0c;小程序隐私弹窗的几个要点&#xff1a; 1、何时弹出用户隐私协议的弹窗&#xff1f; 2、是每次进小程序都弹出来吗&#xff1f; 这两个想明…

info文档与man手册

man 手册 man --version# 查看版本 man 2 socket# 查看section2中的socket yum install man-pages# 更新man手册man -f socket# 列出所有章节的socket # man -f刚开始使用的时候不显示 # centos7执行mandb命令,7以下的版本执行makewhatis命令 # 之后执行man -f就生效了 [rootk…

scrapyd-完整细节

安装scrapyd服务 pip install scrapyd 安装scrapyd客户端 pip install scrapyd-client 安装好以后重新开启cmd输入命令 scrapyd 出现以下结果代表安装成功 打开浏览器输入网址&#xff0c;即可打开界面客户端 http://127.0.0.1:6800/ 回车后显示一下ok内容代表部署成功 回到服…

系统性能调优:提升服务器响应速度

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

servlet 引用src目录下子目录的class文件方法

1、MyServlet class文件所处的目录结构如下&#xff1a; 2、如果在url里直接引用是不行的&#xff0c;http://localhost:9092/GetRequest_Web_exploded/MyServlet 3、需要在web.xml映射后才行&#xff1a; MyServlet com.example.MyServlet <servlet-mapping><ser…

【少儿编程的网站应该怎么选择】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

Ubuntu安装中文拼音输入法

ubuntu安装中文拼音输入法 ubuntu版本为23.04 1、安装中文语言包 首先安装中文输入法必须要让系统支持中文语言&#xff0c;可以在 Language Support 中安装中文语言包。 添加或删除语音选项&#xff0c;添加中文简体&#xff0c;然后会有Applying changes的对话框&#x…