每天一道leetcode:剑指 Offer 11. 旋转数组的最小数字(适合初学者)

news2024/12/27 14:59:55

今日份题目:

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

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2][1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

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

示例1

输入:numbers = [3,4,5,1,2]
输出:1

示例2

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

提示

  • n == numbers.length

  • 1 <= n <= 5000

  • -5000 <= numbers[i] <= 5000

  • numbers 原来是一个升序排序的数组,并进行了 1n 次旋转

题目思路

方法一:暴力搜索

从头到尾遍历数组,如果没有旋转的话应该从头到尾是递增数列,所以如果遇到某个数比前一个数小,那么这个数就是要找的最小的那个旋转的数,如果全程找不到那最小的那个旋转数就是第一个数。

代码

class Solution 
{
public:
    int minArray(vector<int>& numbers) 
    {
        int pre,cur;
        int n=numbers.size();
        if(n==1) return numbers[0];//注意先判断长度,如果只有一个元素,那么运行cur=numbers[1]会出错
        pre=numbers[0];
        cur=numbers[1];
        if(cur<pre) return cur;
        for(int i=2;i<n;i++)
        {
            pre=cur;
            cur=numbers[i];
            if(cur<pre) return cur;
        }
        return numbers[0];
    }
};

提交结果

方法二:二分查找(官方给出)

numbers[mid]和numbers[r]之间会出现三种情况

第一种情况是 numbers[mid]<numbers[r]。如下图所示,这说明 numbers[mid]是最小值右侧的元素,因此我们可以忽略二分查找区间的右半部分。

第二种情况是 numbers[mid]>numbers[r]。如下图所示,这说明 numbers[mid]是最小值左侧的元素,因此我们可以忽略二分查找区间的左半部分。

 第三种情况是 numbers[mid]==numbers[r]。如下图所示,由于重复元素的存在,我们并不能确定 numbers[mid]究竟在最小值的左侧还是右侧,因此我们不能莽撞地忽略某一部分的元素。我们唯一可以知道的是,由于它们的值相同,所以无论 numbers[r]是不是最小值,都有一个它的「替代品」numbers[mid],因此我们可以忽略二分查找区间的右端点。

(思路来源:作者:力扣官方题解 链接:力扣 来源:力扣(LeetCode))

代码

class Solution 
{
public:
    int minArray(vector<int>& numbers) 
    {
        int n=numbers.size()
        int l=0,r=n-1;
        while(l<=r) 
        {
            int mid=(l+r)/2;
            if(numbers[mid]<numbers[r]) r=mid;
            else if(numbers[mid]>numbers[r]) l=mid+1;
            else r--; 
        }
        return numbers[l];
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

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

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

相关文章

前端页面性能优化,性能测试算法优化,MeterSphere开源持续测试平台v2.10.5 LTS版本发布

2023年8月7日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.10.5 LTS版本。自2023年5月发布v2.10 LTS版本后&#xff0c;MeterSphere开源项目组坚持每两周发布小版本&#xff0c;持续进行问题的修复更新&#xff0c;并针对部分功能进行优化。 本次发布的MeterSphe…

【深度学习】采用自动编码器生成新图像

一、说明 你知道什么会很酷吗&#xff1f;如果我们不需要所有这些标记的数据来训练 我们的模型。我的意思是标记和分类数据需要太多的工作。 不幸的是&#xff0c;大多数现有模型从支持向量机到卷积神经网&#xff0c;没有它们&#xff0c;卷积神经网络就无法训练。无监督学习不…

7月27日上课内容 Firewalld防火墙

iptables 软件防火墙 包过滤防火墙firewalld 防火墙包过滤防火墙。网络层centos7自带的默认的防火墙。取代iptables firewalld两种配置模式 运行时配置 永久配置 iptables是静态防火墙 firewalld是动态防火墙。 firewalld安装区域来进行划分: 9个区域 moba里面要打开防火墙 fi…

智慧工厂解决方案[60页PPT]

导读&#xff1a;原文《》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电子版内容参考学习 您可以关注…

OpenCv.js(图像处理)学习历程

opencv.js官网 4.5.0文档 以下内容整理于opencv.js官网。 简介 OpenCV由Gary Bradski于1999年在英特尔创建。第一次发行是在2000年。OpenCV支持c、Python、Java等多种编程语言&#xff0c;支持Windows、Linux、Os X、Android、iOS等平台。基于CUDA和OpenCL的高速GPU操作接口也…

【Seata1.5.2 下载 配置 整合 踩坑 测试】—— 含各种踩坑记录(详细版)

&#x1f4a7; S e a t a 1.5.2 ——含各种踩坑记录 \color{#FF1493}{Seata1.5.2 —— 含各种踩坑记录} Seata1.5.2——含各种踩坑记录&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &…

KM生存分析

这个系列从2022年开始&#xff0c;一直更新使用R语言分析数据及绘制精美图形。小杜的生信笔记主要分享小杜学习日常&#xff01;如果&#xff0c;你对此感兴趣可以加入该系列的学习。 最终图形 本期图形代码 ##KM生存分析 ##20230807##导入包 library(survival) library(surv…

【深度学习】StyleGANv2 2019 论文,Analyzing and Improving the Image Quality of StyleGAN

StyleGAN论文&#xff1a; 《A Style-Based Generator Architecture for Generative Adversarial Networks》 论文&#xff1a;https://arxiv.org/abs/1812.04948 代码&#xff1a; https://github.com/NVlabs/stylegan StyleGANv2论文&#xff1a; 《Analyzing and Improving …

Linux葵花宝典-无需自宫版

1. Linux简介 1.1 什么是Linux Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由Linus Torvalds于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个基于POSIX的多用户、多任务、…

【知网检索稳定】第八届现代管理和教育技术国际学术会议(MMET2023)

第八届现代管理和教育技术国际学术会议&#xff08;MMET 2023&#xff09;将于2023年09月22-24日在中国上海召开。会议由四川大学、泰国程逸皇家大学、泰国程逸皇家大学中泰同文同学国际交流中心主办、乐山师范学院、四川职业技术学院、AEIC学术交流中心协办。会议主要围绕会议…

边写代码边学习之numpy

1. numpy.matmul() 用法 matmul() 用于计算两个数组的矩阵乘积。示例如下 def matmul_test():array1 np.array([[[1.0, 3], [1, 1], [2, 3]]])array2 np.array([[2, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0],[1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], ])result np.matmul(array1, …

C语言有关文件的操作

打开文件与关闭文件 在编写代码时&#xff0c;我有一个习惯是“保证一一对应”。 写下代码fopen()之后&#xff0c;还没有写对文件进行增删查改等操作的代码&#xff0c;先立刻写上fclose()&#xff0c;避免忘记关闭FILE* fd的情况。 不关闭fd&#xff0c;在fopen()次数较少的…

linux初始命令

如果没有ip地址&#xff0c;配置&#xff1a; 查看当前时间&#xff1a; 指定格式查看时间&#xff1a; 修改时间&#xff1a; 查看时区&#xff1a; 设置时区&#xff1a; 查看当前工作目录&#xff1a; root的家目录就是根&#xff0c;普通用户家目录是home

迈瑞BeneVision N17/N15/N12协议解析

迈瑞BeneVision N17/N15/N12协议解析

pdf 怎么转换成word 文档?这几种方法不容错过

pdf 怎么转换成word 文档&#xff1f;PDF 和 Word 都是日常工作和学习中常见的文档格式&#xff0c;但是它们拥有不同的特点。PDF 可以保持文档格式的一致性&#xff0c;并且不易修改&#xff0c;而 Word 则更加灵活&#xff0c;可以随意编辑和修改。因此&#xff0c;将 PDF 转…

春秋云镜 CVE-2020-26042

春秋云镜 CVE-2020-26042 Hoosk CMS v1.8.0 存在sql注入漏洞 靶标介绍 Hoosk CMS v1.8.0 install/index.php 存在sql注入漏洞。 启动场景 漏洞利用 SQL注入POC POST /install/index.php HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; r…

无涯教程-Perl - chdir函数

描述 此功能将当前工作目录更改为EXPR,如果未指定,则更改为用户的主目录。此函数调用等效于Unix命令 cd EXPR 。 语法 以下是此函数的简单语法- chdir EXPRchdir返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例代码,假设您在/user/home/…

【stm32】初识stm32—stm32环境的搭建

文章目录 &#x1f6f8;stm32资料分享&#x1f354;stm32是什么&#x1f384;具体过程&#x1f3f3;️‍&#x1f308;安装驱动&#x1f388;1&#x1f388;2 &#x1f3f3;️‍&#x1f308;建立Start文件夹 &#x1f6f8;stm32资料分享 我用夸克网盘分享了「STM32入门教程资料…

Proxmox VE lxc容器中使用samba共享文件夹遇到mount error(1): Operation not permitted 的解决

问题描述&#xff1a; 在PVE的LXC 容器中使用samba成功创建共享并使用&#xff0c; 用smbclient访问共享可以正常连接和使用&#xff0c;但是使用 mount.cifs 或者 mount.smb3时提示权限错误 mount error(1): Operation not permitted Refer to the mount.cifs(8) manual page…

【机密计算-大厂有话说】AMD

基于 VirTEE/SEV 的 SEV-SNP 平台证明 刊号 58217&#xff0c;版本 v1.2&#xff0c;发布于 2023.7 1. 介绍 VirTEE/sev 工具箱提供了一套基于 rust 语言的简单易用的 API 来访问 AMD EPYC 处理器内的安全处理器&#xff0c;这个库已经早已经支持传统的 SEV 固件&#xff0c;最…