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.length1 <= n <= 5000-5000 <= nums[i] <= 5000nums原来是一个升序排序的数组,并进行了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、解题思路:
-
二分查找初始化 :设置左右指针
left和right分别指向数组的起始和末尾。 -
循环条件 :当
left小于right时,继续循环。循环的目的是逐步缩小查找范围,直到找到最小值。 -
中间点计算 :计算中间索引
mid,避免溢出。 -
比较中间元素与右端元素 :
- 中间元素大于右端元素 :说明最小值位于右半部分,将左指针移动到
mid + 1。 - 中间元素小于右端元素 :说明最小值位于左半部分(包括
mid),将右指针调整为mid。 - 中间元素等于右端元素 :此时无法确定最小值的具体位置,通过将右指针左移一位来缩小查找范围。这一步是处理重复元素的关键,确保即使存在重复值,也能正确找到最小值。
- 中间元素大于右端元素 :说明最小值位于右半部分,将左指针移动到
-
终止条件 :当
left和right相遇时,循环结束,此时left指向的元素即为最小值。
相关文章:
LeetCode-154. 寻找旋转排序数组中的最小值 II
1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [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 层,每一层至多 26 个节点(字母) int cnt[N];//字符串至多 N 个ÿ…...
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
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,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...
C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...
Linux中的UDP编程接口基本使用
UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络 在本篇中,主要考虑下面的内容: 创建并封装服务端:了解创建服务端的…...
RAG项目实战:金融问答系统
需求痛点 私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢? 需求分析 是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
虚拟机Linux操作(持续更新ing)
虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机,可以选择数字或者具体时间 shutdown -h now # 立刻重启,可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...
【开源-线程池(Thread Pool)项目对比】
一些实现**线程池(Thread Pool)**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用,代码简洁;适合快速原型开发。功能较为基础,不支持动态调整线程数…...
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式) 一、项目背景 在软件测试过程中,使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制,并完善脚本以…...
Jackson注解实战:@JsonInclude的妙用
在日常的Java开发中,我们经常需要将Java对象序列化为JSON格式,以便进行数据传输或存储。然而,有时候我们并不希望在JSON中包含某些空值或不必要的字段,这不仅会增加数据的冗余性,还可能对后续的处理造成困扰。Jackson库…...
CAN总线通信协议学习1——物理层
首先来看看CAN是怎么产生的:简单理解,CAN就是一种“拥有特别连接方式”的数据传输的总线,其有特定的一些规则。 (注:资料及图片来源于知乎博主TOMOCAT。) CAN总线的结构 查阅参考文献,OSI标准…...
Vim 常用快捷键大全:跳转、编辑、查找替换全解析
摘要: Vim 是一款非常强大的文本编辑器,许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令,从基本模式、光标移动、编辑操作到查找替换,再到文件保存等常用操作,帮助你快速上手并提…...
【Python 数据结构 2.时间复杂度和空间复杂度】
Life is a journey —— 25.2.28 一、引例:穷举法 1.单层循环 所谓穷举法,就是我们通常所说的枚举,就是把所有情况都遍历了的意思。 例:给定n(n ≤ 1000)个元素ai,求其中奇数有多少个 判断一…...
【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))){//没找到结果;没有重复出现过se…...
《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》
--- ## 前言:为什么传统学习法正在杀死你的竞争力? 在新能源汽车领域,我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时,固态电池已进入量产倒计时;当自动驾驶还在L2级徘…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
