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

从零学算法154

154.已知一个长度为 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

  • 暴力解法就不过多赘述了,从头到尾遍历一遍看哪个值突然不是保持升序的,那他就是最小值,或者直接对数组排序然后取首个元素,没意义。
  • 他人解法:首先经过旋转后以最小值 x 为分界点会分为左右两个升序数组,并且 x 一定在右数组,且为起点,因为旋转就是把最小值转到右边去了(旋转 0 次可以视为只有右数组)。从左右两端 left,right 为区间进行查找,中点值 mid 的可能性有三种:
    • mid < right: 说明 mid 在右数组,所以 mid 可能为 x,所以直接排除区间 (mid,right],即 right 更新为 mid
    • mid > right: 说明 mid 在左数组,在左数组 mid 就不可能为 x 了,所以所以直接排除区间 [left,mid],即 更新 left 为 mid+1
    • mid = right: 此时由于数组元素可能重复比如 [2,2,2,0,2] 和 [2,0,2,2,2],此时无法确定 mid 在左右哪个数组,不能直接去掉一部分区间了。但是无论是哪种情况,right 肯定是没用了,因为就算 right 等于 x,那我 mid 也等于 x,所以就谨慎地只去掉 right,也就是 right = right - 1。
    • 当 mid = right 时。换个说法再解释一下:首先如果 x 小于 right 对应的值,那 right 去掉也就去掉了,x 仍然在 [left,right-1];其次就算 right 对应的就是 x,首先 mid <= left ,因为 mid=right=x,x 已经是最小值了,那最小值肯定小于等于 left 了,同时 left<=mid<right 是恒成立的(因为 mid 是 (left+right)/2),但是你这时候 mid=right=x,也就是说 left<=mid<x,mid < x 代表了 mid 在左数组(因为 x 是右数组起点),既然 mid 在左数组,那么根据左数组的升序特性 left<=mid 恒成立mid <= left 并且 mid >= left,那就只能说 mid 岂不是就等于 left,由于区间 [left,mid] 是升序的,那么 left - mid 的值都是相等的。在 right 对应 x 时减 1 后代表的其实就是正好把右数组全部抛弃了,剩下的左数组全等,且都等于 x,那么无论你怎么查找,最后剩下的值都等于我们最终要的 x。
  • 为什么 mid 不和 left 比较,因为二分的目的是为了判断 mid 处于左右的哪个数组。mid > left 时比如 [1,2,3,4,5] 和 [3,4,5,1,2] mid 分别在右数组和左数组,这就无法判断了。
  •   public int minArray(int[] nums) {int i = 0,j = nums.length - 1;while(i<j){int mid = (i + j)/2;if(nums[mid] > nums[j])i=mid+1;else if(nums[mid] < nums[j])j=mid;else j--;}return nums[i];}
    

相关文章:

从零学算法154

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

95 | Python 设计模式 —— 策略模式

策略模式(Strategy Pattern) 引言 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装在独立的策略类中,使得这些算法可以相互替换,而不影响客户端的使用。策略模式可以让客户端根据不同的需求选择不同的算法,从而使得系统更加灵活和可扩展。 在本…...

【BASH】回顾与知识点梳理(十九)

【BASH】回顾与知识点梳理 十九 十九. 循环 (loop)19.1 while do done, until do done (不定循环)19.2 for...do...done (固定循环)19.3 for...do...done 的数值处理(C写法)19.4 搭配随机数与数组的实验19.5 shell script 的追踪与 debug19.6 what_to_eat-2.sh debug结果解析 该…...

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随着自动…...

计算机基础之RAID技术

概述 RAID&#xff0c;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff0c;一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组&#xff08;逻辑硬盘&#xff09;&#xff0c;从而提供比单个硬盘更高的存储…...

辽宁线上3D三维虚拟工厂生产仿真系统应用场景及优势

工厂虚拟仿真是一种基于计算机技术和虚拟现实技术的数字化解决方案&#xff0c;它可以通过模拟工厂中的设备、流程和操作&#xff0c;来为工程师和操作人员提供了一个沉浸式的虚拟环境&#xff0c;帮助他们更好地了解和优化工厂生产过程。 工厂VR三维可视化技术为工业生产提供了…...

csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表

一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证&#xff0c;我只要把csrf的这个中间件打开&#xff0c; 那就意味着所有的方法都要被验证 在所有的视图函数中&#xff1a;只有几个视图函数做验证只有几个函数…...

(WWW2023)论文阅读-Detecting Social Media Manipulation in Low-ResourceLanguages

论文链接&#xff1a;https://arxiv.org/pdf/2011.05367.pdf 摘要 社交媒体被故意用于恶意目的&#xff0c;包括政治操纵和虚假信息。大多数研究都集中在高资源语言上。然而&#xff0c;恶意行为者会跨国家/地区和语言共享内容&#xff0c;包括资源匮乏的语言。 在这里&#xf…...

centos-stream-9 centos9 配置国内yum源 阿里云源

源配置 tips: yum配置文件路径 /etc/yum.repos.d/centos.repo 1.备份源配置 [Very Important!]mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.backup2.Clean Cache: yum clean all3.Backup the Old CentOS-Base.repo If exist this file.cd /etc/yum.repos.…...

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…...

js和nodejs如何将文件切片和合并

nodejs进行文件切片合并 使用nodejs读取文件流&#xff0c;并对流进行切片合并等操作&#xff0c;就需要用到Buffer对象&#xff0c;可对文件流进行切片&#xff0c;并合并。 const fs require(fs)// 读取一个文件&#xff0c;使用fs读取文件获取一个Buffer类型数据 const b…...

Java内存模型

Java内存模型全称JMM&#xff08;Java Memory Model&#xff09; 内存主要有堆和栈组成 下面来一段demo代码详细讲解堆栈的作用&#xff0c;以及流程 public class Employee {private String name;private Integer age;private Department department;public Employee(){}pub…...

[国产MCU]-BL602开发实例-看门狗定时器(WDG)

看门狗定时器(WDG) 文章目录 看门狗定时器(WDG)1、看门狗定时器(WDG)介绍2、看门狗定时器驱动API介绍3、看门狗定时器使用实例看门狗(Watchdog),又叫看门狗定时器(Watchdog Timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器…...

28 | Boss直聘数据分析

针对boss直聘网的招聘信息,然后分析互联网发展排名前十的城市在互联网方面职位的薪水,学历要求,经验要求,等等信息。 准备从以下几个方面进行分析: (1)各个城市的平均工资 (2)各个学历的平均工资 (3)各个岗位的平均工资 (4)不同工作经验要求的工资 (5)各个经验…...

Hash 缓存

Hash 缓存 输出文件名&#xff08;Hash&#xff09; 静态资源缓存是前端性能优化的一个点&#xff0c;所以在前端开发过程中&#xff0c;一般会最大限度的利用缓存&#xff08;这里主要是强缓存&#xff09;。如果设置了强缓存后&#xff0c;每次当我们部署了新的项目文件到线…...

腾讯云CVM服务器标准型S5性能CPU处理器测试

腾讯云服务器CVM标准型S5实例是次新一代的标准型实例&#xff0c;CPU采用主频2.5GHzIntel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3.1GHz&#xff0c;云服务器S5基于全新优化虚拟化平台&#xff0c;提供了平衡、稳定的计算、内存和网络资源&#x…...

【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题

题目1 给定一个有正、有负、有0的数组arr&#xff0c; 给定一个整数k&#xff0c; 返回arr的子集是否能累加出k 1&#xff09;正常怎么做&#xff1f; 2&#xff09;如果arr中的数值很大&#xff0c;但是arr的长度不大&#xff0c;怎么做&#xff1f; 问题 1&#xff09;…...

【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?

问题描述 在React的前端页面中&#xff0c;判断某个变量值是否被定义&#xff1f;根据是否定义显示不同的内容&#xff1f; 问题场景 假如&#xff0c;现在有一个需求是设计一个新功能&#xff0c;新功能中要求新增一个之前没有的变量&#xff0c;假设是计算某一个数组的长度…...

机器学习深度学习——seq2seq实现机器翻译(数据集处理)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——从编码器-解码器架构到seq2seq&#xff08;机器翻译&#xff09; &#x1f4da;订阅专栏&#xff1a;机…...

锁定Mac的内置键盘,防止外接键盘时的误触

场景&#xff1a;把你的外接键盘放在mac上&#xff0c;然后打字时&#xff0c;发现外接键盘误触mac键盘&#xff0c;导致使用体验极差 解决方案&#xff1a;下载Karabiner-Elements这款软件&#xff0c;并给它开启相关权限。 地址&#xff1a;https://github.com/pqrs-org/Ka…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

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

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

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...