牛客网 JZ11 旋转数组的最小数字

news2025/3/13 15:37:11

思路:

法一:

因为数组是非降序的,也就代表该数组是有序的,如果将一开始的元素旋转到后面,那么就会出现一个断点,从大值变为小值的这么一个断点(这是本题的特点)

举例如下:

此时5和1直接就出现了一个断点,那么我们就没必要再进行比较了,因为数组本来就是非降序的,说明最前面的值就是最小值,所以进行旋转后,出现的断点中,那个小值也就是没旋转之前最前面的值(即最小值)

所以我们可以假设最小值为旋转后的第一个元素(如例子中的4),然后按下标顺序开始与4比较,如果第一次碰见比4小的值(如例子中的1),那么就找到了旋转前的第一个元素(也就是最小值),后面就没必要再和4比较了(如例子中的2,3)

答案:

int minNumberInRotateArray(int* nums, int numsLen)
{
    int min = nums[0], i = 0;    //将旋转后第一个元素假设为最小值
    for (i = 1; i < numsLen; i++)   //从第二个元素(即下标为1)开始,循环到最后一个元素
    {
        if (nums[i] < min)    //如果出现断点(即后面的值小于第一个元素的值)
        {
            min = nums[i];     //这个值就是最小值(也就是旋转前的第一个元素)
            break;    //跳出循环,没必要继续了(因为是非降序,后面的值一定比这个值大)
        }
    }
    return min;    //返回最小值
}

但是题目中的数值范围也不小,已经到了10000,如果运气差点,有可能要循环9999次,效率不高,所以我们可以采用二分法来优化

具体二分法的知识就不再本文赘述了

大致思路如下(举例):

情况一:

情况二:

情况三(特殊情况):

此时就应该缩短数组范围,将右边界往左移(即right--)

答案:

int minNumberInRotateArray(int* nums, int numsLen) 
{
    int left = 0, right = numsLen - 1;
    while (left < right)    
    {
        int mid = (left + right) / 2;   //取中间值
        if (nums[mid] > nums[right])    //情况一
        {
            left = mid + 1;
        }                   
        else if (nums[mid] < nums[right])    //情况二
        {
            right = mid;
        }
        else     //情况三
        {
            right--;    //缩短数组范围
        }
    }
    return nums[left];
}

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

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

相关文章

WEB基础及http协议(Apache)

一、httpd安装组成 http服务基于C/S结构 1、常见http服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题nginx 解决C10K问题lighttpdIIS .asp 应用程序服务器tomcat .jsp 应用程序服务器jetty 开源的servlet容器&#xff0c;基于Java…

深度学习之pytorch实现逻辑斯蒂回归

深度学习之pytorch实现逻辑斯蒂回归 解决的问题数学公式logiatic函数损失值 代码与线性回归代码的区别数据损失值构造回归的函数 结果分析 解决的问题 logistic 适用于分类问题&#xff0c;这里案例( y为0和1 &#xff0c;0和 1 分别代表一类&#xff09; 于解决二分类&#xf…

学习Vue3的第二天

目录 Vue3核心语法 OptionsAPI 与 CompositionAPI setup函数 setup 概述 setup 语法糖 ref 创建&#xff1a;基本类型的响应式数据 reactive 创建&#xff1a;对象类型的响应式数据 ref 创建&#xff1a;对象类型的响应式数据 ref 对比 reactive toRefs 与 toRef co…

实现一个可自适应高度,带有左上角图标,右侧按钮自适应位置的输入框

要点&#xff1a;1.高度自适应&#xff0c;当换行时&#xff0c;高度增加&#xff0c;当删减一定也会高度减少。 2.左上角留出一个logo位置 3.右侧的按钮位置&#xff0c;当最开始的一行没有挤占到时&#xff0c;位于右侧。当一行挤占到了&#xff0c;按钮换行到下方。 效果图&…

【开发战斗系统很难?这几个重要的技术点千万不能忽视!】

作为网游中最重要的MMO类游戏的前身&#xff0c;ARPG游戏是一种非常经典且流行的游戏类型&#xff0c;其诞生的经典之作如&#xff1a;《魂系》、《暗黑破坏神系列》、《塞尔达传说系列》等&#xff0c;大家也是耳熟能详。 可以说ARPG游戏无论从体量还是技术含量都是游戏开发领…

openGauss 5.0.0全密态数据库应用小试

前言 openGauss HCIA教材中&#xff0c;安全是一个重要的章节&#xff0c;在实际项目中&#xff0c;随着网络安全和信息安全形势的变化&#xff0c;企业也越来越重视数据库安全。去年在HALP内部进行openGauss培训时&#xff0c;安全特性就被学员们提出来要重点讲解&#xff0c…

Leetcode 283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

debug - 只要在内存中有显示相关的数据, 就会被CE找到

文章目录 debug - 只要在内存中有显示相关的实际数据, 就会被CE找到概述笔记demo实现demo运行效果用CE查找实际数据地址找到自己的调试点 - 方法1找到自己的调试点 - 方法2打补丁备注END debug - 只要在内存中有显示相关的实际数据, 就会被CE找到 概述 自己写了一个demo, 想验…

【RabbitMQ快速入门】初识RabbitMQ

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

BioTech - 交联质谱 (Crosslinks) 的常见数据格式说明

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136190750 交联质谱 (Crosslinking Mass Spectrometry&#xff0c;Crosslinks) 技术 是一种结合化学交联剂和质谱仪的方法&#xff0c;用于研究蛋…

OSQP文档学习

OSQP官方文档 1 QSQP简介 OSQP求解形式为的凸二次规划&#xff1a; x ∈ R n x∈R^n x∈Rn&#xff1a;优化变量 P ∈ S n P∈S^n_ P∈Sn​&#xff1a;半正定矩阵 特征 &#xff08;1&#xff09;高效&#xff1a;使用了一种自定义的基于ADMM的一阶方法&#xff0c;只需…

Android的Compose

Jetpack Compose 是用于构建原生 Android 界面的新工具包&#xff0c;无需修改任何 XML 布局&#xff0c;也不需要使用布局编辑器。相反&#xff0c;只需调用可组合函数来定义所需的元素&#xff0c;Compose 编译器即会完成后面的所有工作。 简而言之&#xff0c;使用Compose&…

算法-矩阵置零

1、题目来源 73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

Javascript怎么输出内容?两种常见方式以及控制台介绍

javascript是一种非常重要的编程语言&#xff0c;在许多网页中它被广泛使用&#xff0c;可以实现许多交互效果和动态效果。输出是javascript中最基本的操作之一&#xff0c;下面将介绍两种常见的输出方式。 一、使用console.log()函数输出 console.log()函数是常用的输出函数…

Django学习笔记-创建第一个django项目

1.创建一个虚拟环境的python项目 2.点击解释器设置 3.安装django包 4.终端选择Command Prompt 5.创建django项目运行django-admin startproject demo01(自命名) 6.修改连接数据库为mysql 7.修改语言(中国汉语)和时区(亚洲上海)USE_TZ改为False,否则时区不生效 8.修改TEMPLA…

xilinx除法器的使用

平台&#xff1a;Vivado2018.3. 芯片&#xff1a;xcku115-flva1517-2-i (active) 最近学习使用了xilinx除法器&#xff0c;在使用过程中出现了很多次除法器的结果和我预计的结果不一致&#xff0c;特此记录学习一下。 参考文件&#xff1a;pg151.下载地址 pg151-div-gen.pdf …

在线图片生成工具:定制化占位图片的利器

title: 在线图片生成工具&#xff1a;定制化占位图片的利器 date: 2024/2/20 14:08:16 updated: 2024/2/20 14:08:16 tags: 占位图片网页布局样式展示性能测试响应式设计在线生成开发工具 在现代的网页设计和开发中&#xff0c;占位图片扮演着重要的角色。占位图片是指在开发过…

如何确定分库还是 分表?

分库分表 分库分表使用的场景不一样&#xff1a; 分表因为数据量比较大&#xff0c;导致事务执行缓慢&#xff1b;分库是因为单库的性能无法满足要求。 分片策略 1、垂直拆分 水平拆分 3 范围分片&#xff08;range&#xff09; 垂直水平拆分 4 如何解决数据查询问题&a…

用记事本写Java

本篇文章将会用hello word的例子来教大家如何使用记事本写java 1.创建一个txt文件 2.输入代码 public class HelloWorld{public static void main(String[] args){System.out.println("Hello World");} } 3.将文件名后缀由txt改为java 如果不能直接改后缀 打开…

【机器学习笔记】13 降维

降维概述 维数灾难 维数灾难(Curse of Dimensionality)&#xff1a;通常是指在涉及到向量的计算的问题中&#xff0c;随着维数的增加&#xff0c;计算量呈指数倍增长的一种现象。在很多机器学习问题中&#xff0c;训练集中的每条数据经常伴随着上千、甚至上万个特征。要处理这…