leecode153 寻找排序元素中的最小值

力扣153:寻找旋转数组的最小值【C++】 题目分析 给定数组为一个升序数组的旋转形式,即将小于nums.size()个头部data,不变换先后顺序的前提下放入尾部,形成一个新数组,数组装在一个vector容器中,寻找其中最小值。 思路分析 思路一:通过algorithm库中的sort函数,将[v.begin(),v.end())前闭后开区间的data进行升序排序,然后返回nums[0]的值即为题解。这是本题最简单,也是最好想到的思路。但是这样的思路显然不是此题所表达的思路,而且在传入引用的前提下,这样的做法会影响容器中数据的排序。因此不可取。 思路 阅读详情

在这里插入图片描述

我的思路

这个题目难度不难,我的查找思路如下

  1. 如果这个数大于它右边的数,那么这个右边的数是结果

  2. 如果这个数小于它左边的数,那么这个数本身就是结果

  3. 如果这个数即不大于右边的,又不小于左边的,说明我们需要改变窗口的位置

    1. 我们注意到这个数组是两个有序的数组的拼接,所以我们要将这个窗口往拼接的位置上进行去靠进

    2. 我们还可以注意到,这个数组中的两个有序数组,有一个数组的最小值大于另一个数组的最大值

    3. 利用上述性质我们将其与第一开始的元素进行比较,判断当前nums[middle]元素进行比较

      1. 如果nums[middle]>nums[0]说明[0-middle]是一个有序数组,那么另一个有序数组在[middle到n-1]处,我们调整left位置。
      2. 如果不是那么另一个有序数组在[0-middle]的位置,我们调整right的位置
  4. 如果遍历循环还是没找到,说明这个数组是一个有序数组,并没有移动,或者移动之后又恢复了原样,我们直接返回nums[0]即可

public int findMin(int[] nums) {
    //首先这个数组是最开始递增的,我们需要找到的是第一个nums[mid]>num[mid+1]的数
    int left = -1;
    int right = nums.length;
    while(left+1<right){
        int mid = left+(right-left)/2;
        if(mid<nums.length-1&&nums[mid]>nums[mid+1]){
            return nums[mid+1];
        }
        else if(mid>0 && nums[mid]<nums[mid-1]){
            return nums[mid];
        }
        else{
            if(nums[0]<nums[mid]){
                left=mid;
            }else right = mid;
        }
    }
    return nums[0];
}

灵神的思路

灵神的思路更巧妙,他并不是将nums[mid]和这个左右元素进行比较

而是将nums[mid]和nums[n-1】进行比较

  • 如果 nums[mid]>nums[n−1]
    nums 一定被分成左右两个递增段;第一段的所有元素均大于第二段的所有元素;
    nums[mid]在第一段。
    最小值在第二段。
    所以nums[mid] 一定在最小值的左边
    此时调整left的值
  • 如果 nums[mid]≤nums[n−1],那么 nums[mid]一定在第二段。(或者 nums 就是递增数组,此时只有一段。)
    nums[mid] 要么是最小值,要么在最小值右边。
    此时调整right的值
class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        int left = -1;
        int right = n - 1; // 开区间 (-1, n-1)
        while (left + 1 < right) { // 开区间不为空
            int mid = (left + right) >>> 1;
            if (nums[mid] < nums[n - 1]) {
                right = mid;
            } else {
                left = mid;
            }
        }
        return nums[right];
    }
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/1987499/by-endlesscheng-owgd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【中等】力扣算法题解析LeetCode153:寻找旋转排序数组中的最小值 题目要求在旋转后的升序数组中寻找最小元素,需设计O(log n)算法。核心思路是二分查找:比较中间元素与右边界,若nums[mid] < nums[right],最小值在左半部分(含mid);否则在右半部分(不含mid)。Java实现通过调整左右边界逐步缩小范围,最终重合点即为最小值。时间复杂度O(log n),空间复杂度O(1)。示例验证了算法的正确性,如输入[3,4,5,1,2]输出1。代码简洁高效,适合处理大规模数据。 阅读详情

相关推荐

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

LeetCode - 153. 寻找旋转排序数组中的最小值

摘要:文章详细解析了力扣153题"寻找旋转排序数组中的最小值"的二分查找解法。旋转排序数组被分成两个有序子数组,最小值位于第二个子数组的首位。算法通过比较中间元素与右边界值来确定搜索区间:当nums[mid]>nums[right]时最小值在右半部分,否则在左半部分。以数组[4,5,6,7,0,1,2]为例,展示了二分查找的具体步骤。文章还分析了常见的错误写法(如使用独立if语句、错误的终止条件等),并给出了正确的代码实现。该解法时间复杂度为O(logn),空间复杂度为O(1)。

2402_83315537的博客 1294

USB-Type-C PCB布局布线设计规范

USB Type-C连接器有24个引脚。图1和图2分别显示了USB Type-C插座和插头的插针。母头/母座公头/插头可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流,在保证高速数据传输的同时也提高了电流承载能力。表 1 和表 2 分别汇总了在 USB Type-C 型插座和插头上所使用的信号列表。

weixin_63005522的博客 8277

【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值

摘要: 本文探讨了在旋转排序数组中寻找最小值的算法问题。通过分析数组特性(部分有序),提出了暴力解法(O(n))和二分查找(O(log n))两种解决方案。重点介绍了二分查找的实现方法,包括标准实现和简洁优化版本,并通过示例详细演示了查找过程。文章还对比了不同方法的复杂度与优缺点,总结了通用解题模板和核心思路,最后推荐了相关扩展题目。该算法在前端开发中可应用于时间轴组件、无限滚动列表等场景,帮助开发者从功能实现者提升为高效解决方案设计者。

LYFlied的博客 1008

【ros】ROS1的安装和相关使用方法

主要学习ros相关内容

Greary的博客 2379

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3737

LeetCode 153. 寻找旋转排序数组中的最小值

更多题解尽在每日更新。组队打卡,更多解法等你一起来参与哦!,难度。

m0_64381458的博客 856

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

服务器时不时的会发送短信说你服务器有病毒,找到了这个tmp文件,删除了之后又有了。确实是有很多人就这么无聊,每天都攻击你的服务器。找了很久的原因,网上也提供了一大堆方法,但都是很简陋的答案,具体怎么操作并没有说。没办法只能自己去排查这个问题。从两个角度来考虑,第一是服务器系统问题,比如宝塔的漏洞。但一时半会看不出问题来。只能去排查自己的项目代码。最后了解到代码确实是存在漏洞的。但代码中也确实了很多的校验,为什么会存在漏洞了?这就不得不从上传的过程开始说起。

guiplan 1497

LeetCode第153题_寻找旋转排序数组中的最小值

已知一个长度为n的数组,预先按照升序排列,经由1到n次后,得到输入数组。例如,原数组47注意,数组的结果为数组。给你一个元素值的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。你必须设计一个时间复杂度为O(log n)的算法解决此问题。

qq_40263592的博客 722

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

vite打包文件如何支持files协议,支持双击即可打开网页,支持electron打包文件。

原本的所需框架为vite + element-plus项目,需要打包之后用eletron打包为桌面应用。但遇到一个问题,耗费了整整一下午时间。vite的配置也没有考虑过纯静态页面的情况。打包之后的页面只支持https协议。不断是百度以及问AI然后看vite官网文档,最后终于配置好了。这里有一个问题就是上面箭头所指位置,不支持跨域,也是es6的语法也不支持。配置完之后打包文件如下。

guiplan 1561

LeetCode题解:寻找旋转排序数组中的最小值

本文是二分查找-模版 II 的最后一题,接下来我们将面对更大的挑战,加油~

余光的博客 3589

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

LeetCode 153寻找旋转排序数组中的最小值

LeetCode 153寻找旋转排序数组中的最小值 题目简述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。请找出其中最小的元素。你可以假设数组中不存在重复元素。 输入:[3,4,5,1,2] 输出:1 输入:[4,5,6,7,0,1,2] 输出:0 思路:如果数组长度较短时,可直接使用暴力循环;如果数组有一定长度,则使用二分查找 排序数组旋转后,会分成两段有序序列,最小值前面的数

XBlog 227

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leetcode153寻找旋转排序数组中的最小值

leetcode153寻找旋转排序数组中的最小值 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 可以假设数组中不存在重复元素。 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2] 输出: 0 来源:力扣(LeetC...

LiuRenyou的博客 567

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode 算法-寻找旋转排序数组中的最小值-153

leetcode 算法-寻找旋转排序数组中的最小值 leetcode 传送门 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2]...

u011622021的博客 545

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LeetCode第153和154寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值 题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。 请找出其中最小的元素。 示例 1: 输入:nums = [3,4,5,1,2] 输出:1 示例 2: 输入:nums = [4,5,6,7,0,1,2] 输出:0 示例 3: 输入:nums = [1] 输出:1 提示: 1 <= nums.length <= 5000 -5000 <= nums[i]

qq_41967623的博客 171

Leetcode 153 寻找旋转排序数组中的最小值 C++,Java,Python

Leetcode153 寻找旋转排序数组中的最小值 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组...

Rp的博客 580

Leetcode 153. 寻找旋转排序数组中的最小值 C++

Leetcode 153. 寻找旋转排序数组中的最小值 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。 测试样例了 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2] 输出: 0 题解 二分查找的思想 我们可以根据左值和中值的大小确定旋转点位于哪一个区间上。我们现在查找区间[i,j]

weixin_43750513的博客 386

寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值 来源: LeetCode 153. 寻找旋转排序数组中的最小值 题目描述 153. 寻找旋转排序数组中的最小值 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。 示例 1: 输入: [3,4,...

MrDing_CoolPig的博客 366

LeetCode 专题 -- 二分查找专题 153. 寻找旋转排序数组中的最小值

LeetCode 专题 – 二分查找专题 153. 寻找旋转排序数组中的最小值 难度:中等 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2] 输出: 0 链接: https://leetcode-cn.com/problems/

shinezzz的博客 236

LeetCode153 寻找旋转排序数组中的最小值

LeetCode153 寻找旋转排序数组中的最小值题目解题:二分查找 题目 解题:二分查找 相似题目: 题目 解题 153. 寻找旋转排序数组中的最小值 解题 154. 寻找旋转排序数组中的最小值 II 、剑指 Offer 11. 旋转数组的最小数字 解题 33. 搜索旋转排序数组 解题 // javascript var findMin = function(nums) { const n = nums.length; let left = 0, ri

616

力扣每日一题:153. 寻找旋转排序数组中的最小值

目录题目:153. 寻找旋转排序数组中的最小值示例1示例2示例3提示:解题思路解题代码解题感悟 题目:153. 寻找旋转排序数组中的最小值 难度: 中等 题目: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[2], …, a

aruewds的博客 203
上一篇: leecode162 寻找峰值
下一篇: 深度学习入门,基于python的理论与实现
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值