旋转数组中的最小数字

求旋转数组的最小数字(java实现) 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出数组的最小元素。 例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1 立即下载

求旋转数组中的最小数字

        题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

        思路:

                方式一:根据题目已给的信息,是将一个递增的数组进行旋转,所以,我们可以从后往前遍历数组。时间复杂度:O(n)

                即:定义两个指针分别记作current、before。其中current指向数组中的最后一个元素,before指向数组中的倒数第二个元素。

                比较 numbers[current] 和 numbers[before]的大小。若:numbers[current] > current[before],也就说,目前这两个指针所指向的数据是在一个递增的序列中,于是current--,before--。一直比较。直到numbers[before] > numbers[current]时,此时,我们就找到了旋转点,此时current指向的元素,就是旋转数组中最小的元素

                图示:

                如图,current指向数组的最后一个元素,before指向数组的倒数第二个元素。
在这里插入图片描述
                比较numbers[before] 与 numbers[current]的值,numbers[before] < numbers[current],于是,before--,current--,得下图:

在这里插入图片描述

                再次比较numbers[before]与numbers[current],numbers[before] < numbers[current],于是before--,current--,得下图:
在这里插入图片描述
                此时,numbers[before] > numbers[curent],numbers[current]就是我们要找的元素。

                代码实现:

    public static int minArray(int[] numbers) {
        int current = numbers.length-1;
        int before = current-1;
        while(before>=0 && numbers[before] <=numbers[current]){
            before--;
            current--;
        }
        return numbers[current];
    }

                方式二:二分查找法。平均时间复杂度:O(NlogN),最坏时间复杂度:O(n)

                定义左边界:left,右边界:right,以及中间指针mid。

                比较numbers[mid] 与 numbers[right]。有三种情况:

                ① 当numbers[mid] > numbers[right]时,即中间元素大于右边界元素。说明,数组中的最小值一定不在左半部分(我们始终要注意,旋转数组是由递增数组旋转后得来的),一定是在右半部分的,所以我们将mid+1赋给left。

                ② 当numbers[mid] < numbers[right]时,即中间元素小于右边界元素。说明,数组中的最小值一定不在右半部分,一定是在左半部分。所以我们将mid赋给left;

                ③ 当numbers[mid] == numbers[right]时,此时,我们不能确定数组中的最小值是在左半部分还是右半部分,但我们可以肯定的是,有一个值,能够代替right所指向的值,即numbers[mid]。此时,我们缩小数组的范围,即让right--即可。

                ④ 解决疑问:为什么在右半部分的时候是left = mid+1,而在左半部分的时候是right = mid呢? 这是因为,如果数组最小值在左半部分,即②这种情况,我们已经比较了numbers[mid] < numbers[right],此时,我们不能确定mid指向的值是否是最小的,所以我们需要保留一下。而如果是在右半部分,即①这种情况,我们比较了numbers[mid] > numbers[right],我们已经知道了mid所指向的数最起码要比right指向的数字大,所以它必不可能是最小的数,所以我们需要让mid+1。

                代码实现:

public static int minArray3(int[] numbers){
        int left = 0;
        int right = numbers.length-1;
        int mid=0;
        while(left<=right){
            mid = ((right-left)>>1) + left;
            if(numbers[mid] > numbers[right]){
                left = mid+1;
            }else if(numbers[mid] < numbers[right]){
                right = mid;
            }else{
                right--;
            }
        }
        return numbers[left];
    }
51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南) 本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。 阅读详情

相关推荐

文本纠错项目代码调试

文本纠错项目调试

m0_67084346的博客 868

【算法入门02】旋转数组的最小数字

核心考点:数组理解,二分查找,临界条件 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}是数组{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。NOTE:给出的所以元素都大于0,若数组大小为0,请返回0。 解析一:(不提倡) 寻找数组当中的最小值,不管怎么说,遍历一遍数组当中元素是肯定能找到的。 class Solution { public: int minNumberInRo

2021dragon的博客 2712

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6411

旋转数组的最小值

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 题目来源: 牛客网 思路: 题目告诉给定的是一个非递减排序的数组的一个旋转, 例如数组{3,4,5,1,2}为...

persistence_Y的博客 606

从零构建智能监控系统:ZLMediaKit与SpringBoot的RTSP流处理实战

本文详细介绍了如何从零构建智能监控系统,结合ZLMediaKit与SpringBoot实现RTSP流处理。通过多协议支持、高性能架构设计及工业级部署优化,解决传统监控方案的兼容性差、延迟高等问题,适用于物联网和智能安防领域。

weixin_29002209的博客 370

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{2,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.画一条绿色中点线,可以发现最小值出现在红白相间的一边。红色的区域可以舍弃掉,而红色区域是完全递增数组。这种解法只能求解数组元素不重复的情况,重复的话需要将数组元素全部比较一次。有两种切割方法,一种是右边多切一点,另一种是左边多切一点。看到“递增数组”和“查找最小值”,就要想到二分法。

zhourongxiang1的博客 548

Lumerical INTERCONNECT 中的自相位调制 (SPM) 仿真实践指南

本文详细介绍了在Lumerical INTERCONNECT中进行自相位调制(SPM)仿真的实践指南。从SPM的基础物理原理出发,深入解析非线性薛定谔方程和克尔效应,到INTERCONNECT中NLSE波导元件的配置技巧,以及时域与频域中SPM效应的观测方法。文章还提供了常见问题排查和进阶联合仿真技巧,帮助用户高效完成从仿真到实测的校准过程。

weixin_42565652的博客 187

Java剑指Offer:6.旋转数组中的最小数字

6.旋转数组的最小数字 思路: 该题主要考察对二分查找的理解和应用。 设置左右边界,left = 0,right = arr.length - 1 设置while循环的判定条件,left < right 先判断当前数组或者子数组,是否为非递减数组,比如 1,1,3,4,5,5这种就是非递减数组,如果是非递减数组,说明当前子数组就是旋转后的那一部分升序子数组,arr[left]就是我们所要求的结果。比如3,4,5,1,2。如果left = 3,right = 4即此时,子数组为1,2,为非递减数组

WSQ1529000的博客 156

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5288

65页PPT全面学习大型汽车集团企业IT信息化(管理架构、应用架构、技术架构)

订单到交付(OTD):借助ERP、MES、LES、SRM、QMS、APS等系统,实现财务与业务一体化、高级排产、生产过程自动化及供应链协同。- 数据标准化:数据标准化是企业信息化建设基石,包括制定统一业务解释和标准、维护管理流程、发布应用等,涉及数据统一定义、分类、编码等内容。- 大数据应用:汽车行业大数据应用涵盖生产、销售、售后等环节,如设备预见性保养、销量预测、质量预警等,提升企业运营效率和决策能力。- 策略明晰:明确C2M管理矩阵,包括供应商、采购、物流、制造、销售、财务等环节的策略。

cdfunlove的博客 1049

查找旋转数组中的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路 看到题目的第一反应,肯定不能直接遍历数组,要寻找时间复杂度小于O(n)的方法。由于题目限定的是非递减...

李振da的碎碎念 169

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 808

6.旋转数组中的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 这道题的核心就在于找到第一个递减的数字,这个数字就是要返回的数字 class Solution {...

有没有兴趣和我一起去拯救地球啊 91

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

求旋转数组中的最小数字

1、题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

315

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

剑指Offer 旋转数组中的最小数字

/** * 旋转数组中的最小数字 * * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 * 例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。 * NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 */ public class JZ006MinNumberInRotateArray { /** * 二分法的变种 * @par.

hsx1612727380的专栏 112

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 二维数组的查找
下一篇: 排序数组中查找数字
Colourful.
博客等级 码龄6年 13粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值