寻找排序数组中的最小值

题目描述

已知一个长度为 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[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

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

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

样例输入

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中的所有整数 互不相同
  • nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

题解

旋转排序数组的特点

在旋转排序数组中,nums[mid]的值与其两个端点值nums[0]和nums[nums.size()-1]有一定的关系。如图所示:

nums[mid]要么落入左侧区间,要么落入右侧区间,而判断nums[mid]落入哪个区间的条件就是和两个端点进行比较

  • nums[mid]与nums[0]的关系:
    • nums[mid]>nums[0],则nums[mid]落入左侧区间
    • nums[mid]<nums[0],则nums[mid]落入右侧区间
  • nums[mid]与nums[nums.size()-1]的关系
    • nums[mid]>nums[nums.size()-1],则nums[mid]落入左侧区间
    • nums[mid]<nums[nums.size()-1],则nums[mid]落入右侧区间

上述判定在具体题目中使用哪个以及如何使用可进一步根据题意分析,但是思想是重要的

为什么需要这个判定呢?

因为可以发现,无论nums[mid]落入左侧区间还是右侧区间,这两个区间之间不会发生重叠并且各自有序,因此我们可以根据nums[mid]落入哪个区间之后再进一步使用二分进行解题

在本题中,由于最小值在右侧区间,因此使用nums[mid]与nums[nums.size()-1]进行判定是比较容易的,因为可以避免两个区间中间端点带来的麻烦,代码如下所示

class Solution {
public:int findMin(vector<int>& nums) {int left=0,right=nums.size()-1;while(left<=right){int mid=left+((right-left)>>1);if(nums[mid]>=nums[right])//nums[mid]在左侧区间,收缩左端点{left=mid+1;}else{//nums[mid]在右侧区间,收缩右端点right=mid;//不能使用right=mid-1,可能会在最后由于断点跳过结果值}}return nums[right];}
};

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

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

相关文章

【前端】CSS(引入方式+选择器+常用元素属性+盒模型+弹性布局)

文章目录 CSS一、什么是CSS二、语法规范三、引入方式1.内部样式表2.行内样式表3.外部样式 四、选择器1.选择器的种类1.基础选择器&#xff1a;单个选择器构成的1.标签选择器2.类选择器3.id 选择器4.通配符选择器 2.复合选择器1.后代选择器2.子选择器3.并集选择器4.伪类选择器 五…

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下&#xff0c;默认的内核参数无法利用现有硬件&#xff0c;造成软件崩溃、卡顿、性能瓶颈。 当然&#xff0c;修改参数只是让Linux更好软件的去利用已有的硬件资源&#xff0c;如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…

AcWing 788. 逆序对的数量——算法基础课题解

AcWing 788. 逆序对的数量 题目描述 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。…

vscode开发java的插件和配置

推荐插件 .vscode/extensions.json {"recommendations": ["redhat.fabric8-analytics","ms-azuretools.vscode-docker","vscjava.vscode-java-pack","eamodio.gitlens","obkoro1.korofileheader","redhat.j…

代码随想录算法训练营第三十一天|455.分发饼干、376.摆动序列、53.最大子数和

文档链接&#xff1a;https://programmercarl.com/ LeetCode455.分发饼干 题目链接&#xff1a;https://leetcode.cn/problems/assign-cookies/ 思路&#xff1a;我采用的是优先用小饼干喂小孩。 贪心&#xff1a; class Solution { public:int findContentChildren(vecto…

点云滤波与匹配进阶

0. 简介 之前作者专门为点云匹配写了几篇博客&#xff0c;但是我们发现最近几年有更多的新方法已经在不断地被使用。同时之前有些内容也没有很好的概括&#xff0c;所以这里我们将作为一篇进阶文章来介绍这些方法的使用。 1. 地面点去除 处了使用一些复杂的方法&#xff08;…

Cute Background FX

Cute Background FX是环境背景粒子系统的集合。非常适合作为菜单的背景。 该包包括: -20个独特预制件+20个URP预制件 -5种独特的环境设计 -15种纹理 -2个自定义着色器+2个URP着色器 -共59项独特资产 -一个演示场景,您可以在其中概述所有内容。 所有纹理都是512x512分辨率的P…

基于SSM框架实现的在线心理评测与咨询系统(技术栈 spring+springmvc+mybatis+jsp+jquery+css)

一、项目简介 本项目是一套基于SSM框架实现的在线心理评测与咨询系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

iOS 应用内网络请求设置代理

主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用&#xff0c;我们可以通过界面来进行设定&#xff08;是否开启代理、服务端、端口&#xff09;&#xff0c;从而达到类似系统上的设定 具体链接参考&#xff1a;为 iOS 网络请求设置代理…

代码随想录算法训练营33期 第二十九天(补第二十八天)| 93.复原IP地址、78.子集、 90.子集II

93.复原IP地址 class Solution { public:vector<string> result;bool isValid(const string& s, int start, int end){if (start > end){return false;}if (s[start]0 && start ! end){return false;}int num 0;for (int istart; i<end; i){if (s[i]…

设计模式总结-桥接模式

桥接模式 模式动机模式定义模式结构模式分析桥接模式实例与解析实例一&#xff1a;模拟毛笔 模式优缺点 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形&#xff0c;我们至少需要4个形状类&#xff0c;但是如果绘制的图形需要具有不同的颜色&#xff0c;如红色、绿色、蓝色…

linux内核网络源码分析--功能专用字段‘每日读书’

linux内核是模块化的&#xff0c;允许你选择要包含什么以及省略什么。因此&#xff0c;只有当内核编译位支持特定功能时候&#xff0c;如防火墙或者Qos&#xff0c;某些字段才会包含在sk_buff数据结构中。 unsigned long nfmark __u32 nfcache __u32 nfctinfo struct nf_conntr…

xss.pwnfunction-Ugandan Knuckles

这个是把<>过滤掉了所以只能用js的事件 ?weya"onfocus"alert(1337)" autofocus"

基于springboot的社区医疗服务系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

数据结构面试题报错调试方法记录

栈和队列报错调试 1.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 此题解题思路如下&#xff1a; 先将数据放在pushst栈里面&#xff0c;popst栈为空再把pushst栈里面的数据放进popst栈里面去&#xff0c;不为空则不执行。不为空时候直接拿取栈…

基于C语言实现 SQL数据库和链表的相互转换

使用的函数介绍 这里sqlite3_open、sqlite3_close就不介绍了 sqlite3_prepare_v2()&#xff1a; 函数原型&#xff1a;int sqlite3_prepare_v2(sqlite3* db, const char* zSql, int nByte, sqlite3_stmt** ppStmt, const char** pzTail);作用&#xff1a;准备 SQL 语句以供执…

WSL2迁移后默认登陆用户为root的解决方案

第一步&#xff0c;在wsl的root用户下面用vim打开/etc/wsl.conf文件 vim /etc/wsl.conf第二步&#xff0c;在文件中添加以下代码, 仅需把user_name替换成你原来wsl的用户名即可 [user] defaultuser_name如 [user] defaultpengyuyan重启wsl,在powershell下输入 wsl --shutdo…

【GDB】GDB解CORE文件

目录 一 GDB解析CORE文件(Linux) 二 GDB解析CORE文件(QNX) 在 Linux 系统中,当一个进程发生崩溃或异常时,它会生成一个所谓的 core dump 文件,其中包含了该进程的内存映像和一些调试信息。这个文件可以用于分析和解决崩溃问题,以便了解进程崩溃时的状态和原因

多模态text-image模型之ITM loss(blip)

主要代码&#xff1a; # forward the positve image-text pair # 正向传播正面的图像文本对 output_pos self.text_encoder.bert(encoder_embedstext_embeds, attention_masktext.attention_mask,encoder_hidden_statesimage_embeds,encoder_attention_maskimage_atts, …

【技术笔记】Ubuntu下VirtualBox不能识别USB解决办法(手把手解决)

环境说明 系统版本&#xff1a;Ubuntu 20.04 VirtualBox版本&#xff1a; 7.0.12 解决过程 扩展下载&#xff0c;进入VirtualBox 官方下载路径。选择本机安装版本&#xff0c;如下图所示&#xff0c;因笔者是7.0.x版本&#xff0c;因此点击第一条链接&#xff1b; 进入版本页…