当前位置: 首页 > news >正文

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

1、题目描述:

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]
  • 若旋转 7 次,则可以得到 [0,1,4,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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须尽可能减少整个过程的操作步骤。

示例 1:

输入:nums = [1,3,5]
输出:1

示例 2:

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

提示:

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

2、代码:

class Solution {
public:int findMin(vector<int>& nums) {// 初始化左右指针int left = 0, right = nums.size() - 1;// 当左指针小于右指针时,继续二分查找while (left < right) {// 计算中间索引,避免溢出int mid = left + (right - left) / 2;// 如果中间值等于右端值,无法确定最小值的位置,右指针左移一位if (nums[mid] == nums[right]) {--right;  // 缩小搜索范围}// 如果中间值小于右端值,说明最小值在左半部分(包括mid)else if (nums[mid] < nums[right]) {right = mid;  // 调整右边界到 mid}// 如果中间值大于右端值,说明最小值在右半部分else {left = mid + 1;  // 调整左边界到 mid + 1}}// 循环结束时,left 和 right 相遇,指向最小值return nums[left];}
};

3、解题思路:

  1. 二分查找初始化 :设置左右指针leftright分别指向数组的起始和末尾。

  2. 循环条件 :当left小于right时,继续循环。循环的目的是逐步缩小查找范围,直到找到最小值。

  3. 中间点计算 :计算中间索引mid,避免溢出。

  4. 比较中间元素与右端元素

    • 中间元素大于右端元素 :说明最小值位于右半部分,将左指针移动到mid + 1
    • 中间元素小于右端元素 说明最小值位于左半部分(包括mid),将右指针调整为mid
    • 中间元素等于右端元素 :此时无法确定最小值的具体位置,通过将右指针左移一位来缩小查找范围。这一步是处理重复元素的关键,确保即使存在重复值,也能正确找到最小值。
  5. 终止条件 leftright相遇时,循环结束,此时left指向的元素即为最小值。

相关文章:

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

1、题目描述&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,…...

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法&#xff08;顾名思义&#xff0c;就是把没有顺序的…...

Ubuntu从零创建Hadoop集群

目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

Node.js, Bun, Deno 比较概述

以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl&#xff08;Node.js 原作者&#xff09;Jarred Sumner运行时引擎V8&#xff08;Chrome&#xff09;V8&#xff08;Chrome&#xff09;JavaScriptCore&#…...

C# 类库打包dll文件

目录 前言操作流程注意事项 前言 在C#中&#xff0c;有多种方式可以对代码进行加密&#xff0c;以保护源代码不被轻易查看或修改&#xff0c;这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中&#xff0c;选择“创建新项目”。 选…...

Linux中的UDP编程接口基本使用

UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式&#xff0c;有了这些理论基础之后&#xff0c;下面先从UDP编程开始从操作部分深入网络 在本篇中&#xff0c;主要考虑下面的内容&#xff1a; 创建并封装服务端&#xff1a;了解创建服务端的…...

RAG项目实战:金融问答系统

需求痛点 私有知识很多&#xff0c;如何让大模型只选择跟问题有关的知识进行参考呢&#xff1f; 需求分析 是否可以使用关键词匹配呢&#xff1f;以前的搜索主要使用关键词匹配&#xff0c;这个要求太高了&#xff0c;需要提前抽取准备好关键词&#xff0c;有点像以前SEO的工…...

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解&#xff0c;接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化&#xff0c;以下是详细介绍及代码示例&#xff1a; 1. React 高级特性的深入学习 1.1 React 并发模式&#xff08;Con…...

虚拟机Linux操作(持续更新ing)

虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机&#xff0c;可以选择数字或者具体时间 shutdown -h now # 立刻重启&#xff0c;可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...

【开源-线程池(Thread Pool)项目对比】

一些实现**线程池&#xff08;Thread Pool&#xff09;**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用&#xff0c;代码简洁&#xff1b;适合快速原型开发。功能较为基础&#xff0c;不支持动态调整线程数…...

JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)

JMeter 实战项目脚本录制最佳实践&#xff08;含 BadBoy 录制方式&#xff09; 一、项目背景 在软件测试过程中&#xff0c;使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制&#xff0c;并完善脚本以…...

Jackson注解实战:@JsonInclude的妙用

在日常的Java开发中&#xff0c;我们经常需要将Java对象序列化为JSON格式&#xff0c;以便进行数据传输或存储。然而&#xff0c;有时候我们并不希望在JSON中包含某些空值或不必要的字段&#xff0c;这不仅会增加数据的冗余性&#xff0c;还可能对后续的处理造成困扰。Jackson库…...

CAN总线通信协议学习1——物理层

首先来看看CAN是怎么产生的&#xff1a;简单理解&#xff0c;CAN就是一种“拥有特别连接方式”的数据传输的总线&#xff0c;其有特定的一些规则。 &#xff08;注&#xff1a;资料及图片来源于知乎博主TOMOCAT。&#xff09; CAN总线的结构 查阅参考文献&#xff0c;OSI标准…...

Vim 常用快捷键大全:跳转、编辑、查找替换全解析

摘要&#xff1a; Vim 是一款非常强大的文本编辑器&#xff0c;许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令&#xff0c;从基本模式、光标移动、编辑操作到查找替换&#xff0c;再到文件保存等常用操作&#xff0c;帮助你快速上手并提…...

【Python 数据结构 2.时间复杂度和空间复杂度】

Life is a journey —— 25.2.28 一、引例&#xff1a;穷举法 1.单层循环 所谓穷举法&#xff0c;就是我们通常所说的枚举&#xff0c;就是把所有情况都遍历了的意思。 例&#xff1a;给定n&#xff08;n ≤ 1000&#xff09;个元素ai&#xff0c;求其中奇数有多少个 判断一…...

【Qt QML】QML鼠标事件(MouseArea)

QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …...

LeetCode 202. 快乐数 java题解

https://leetcode.cn/problems/happy-number/description/ 哈希表 class Solution {public boolean isHappy(int n) {if(n1) return true;HashSet<Integer> setnew HashSet<>();while(n!1&&!(set.contains(n))){//没找到结果&#xff1b;没有重复出现过se…...

《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》

--- ## 前言&#xff1a;为什么传统学习法正在杀死你的竞争力&#xff1f; 在新能源汽车领域&#xff0c;我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时&#xff0c;固态电池已进入量产倒计时&#xff1b;当自动驾驶还在L2级徘…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...