(leetcode算法题)287. 寻找重复数(经典题目,二分解法)

如果一个题目限定了数据范围是[1, n]内的整数,那么这个题目可以思考的就是

nums[i]和 i 的关系,769. 最多能完成排序的块 这个题就使用到了子数组中最大值和 连续[0, n - 1]的关系

而对于本题来说,也可以思考[1, n] 和 nums[i] 的关系,想要观察他们之间的关系

以nums = [1,3,4,2,2]为例,可以画出如下散点图,下列散点图,因为这个题要求不能更改原数组,而且只能使用o(1)的空间复杂度设计算法,所以直接画出{1, 1}, {2, 3}, {3, 4}, {4, 2}, {5, 2} 这几个点

这个图 已经包含了所有nums中的信息,那么如何去解读这张图的信息来找到 2这个出现两次的纵坐标呢?

        一个很自然的想法就是画一条水平线,让这条水平线从上往平移,一旦平移到穿过两个即以上的点,那么此时这条水平线的纵坐标就是要找的重复两次的数,这样的想法就是两个for循环来实现的o(n2) 的算法,能够满足题目要求,但是这样的算法不能通过全部测试用例

那么怎么解决这个问题?首先想一想有没有o(nlogn)的解法?

logn的解法中二分就是很常见的算法,可是二分只能针对有序数组进行啊,1 3 4 2 2 算哪门子的有序数组?那不如换个思路,在上图中画出四条平行线,y1 = 1, y2 = 2, y3 = 3, y4 = 4,观察后发现,

y1 穿过以及其下方的点有1个,y2 穿过以及其下方的点有3个,

y3 穿过以及其下方的点有4个,y4 穿过以及其下方的点有5个

正好是在 y2 处多穿过了两个点,

此时可以根据以上事实发现如下规律:

要找的数是[1,n-1]中的某个target,这个target满足下列性质

假设x是属于[1,n-1]中的一个数,记在nums中小于等于x的有yx个

如果yx <= x,则x 一定不是要找到的target,且x < target

如果yx > x,则纳入target备选集合中,且x >= target

而target就是备选集合中最小的那个数

那么就可以使用如下算法

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

其实现原理可以通过几张图演示

 

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

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

相关文章

获得PostgreSQL中级认证后,可以从事哪些工作岗位?

获得 PostgreSQL 中级认证后&#xff0c;可以获得的岗位 数据库管理类 数据库管理员&#xff08;DBA&#xff09;&#xff1a;负责 PostgreSQL 数据库的日常维护、监控、备份与恢复、性能优化、安全管理等工作。确保数据库的稳定运行和数据的安全性、完整性&#xff0c;及时处理…

4.1、二纤单向、二纤双向、四纤双向,网络级保护

1、线性复用段保护&#xff08;LMSP&#xff09; 就像是给网络业务传输准备的一个 “保险”。在 SDH 和 MSTP 网络里&#xff0c;业务信号要通过一段一段的路&#xff08;复用段&#xff09;来传输&#xff0c;LMSP 就是为了保证这些路出问题的时候&#xff0c;业务还能正常走。…

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功 1. 准备安装包与maven编译环境1.1 安装环境准备1.2 修改pom1.3 打包命令2. 编译与问题解决2.1 开始编译 失败, 缺包pentaho-aggdesigner-algorithm:pom:5.1.5-jhyde2.2 Hive Spark Remote Client 模块…

SQL-leetcode-584. 寻找用户推荐人

584. 寻找用户推荐人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中&#xff0c;id 是该表的主键列。 该表的每一行表示一个客户的 id、姓名以及推…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据&#xff1a;描述事物的符号记录 数据库&#xff08;DB&#xff09;&#xff1a;长期存储在计算机内的、…

Scala语言的面向对象编程

Scala语言的面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来组织代码&#xff0c;这些对象能够包含数据&#xff08;属性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…

【JVM-2.1】如何使用JMC监控工具:详细步骤与实战指南

Java Mission Control&#xff08;JMC&#xff09;是Oracle提供的一个高级图形化监控工具&#xff0c;专为Java应用程序的性能分析和故障排查设计。JMC不仅提供了实时监控功能&#xff0c;还支持飞行记录器&#xff08;Flight Recorder&#xff09;功能&#xff0c;能够记录JVM…

QT c++ 样式 设置 标签(QLabel)的渐变色美化

上一篇文章中描述了按钮的纯色&#xff0c;本文描述标签的渐变色美化。 1.头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

设计模式 行为型 观察者模式(Observer Pattern)与 常见技术框架应用 解析

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。 一…

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

system securiry: supervisor password required

报错解释&#xff1a; 这个错误表明系统安全模块&#xff08;如SELinux或AppArmor&#xff09;需要超级用户&#xff08;通常是root&#xff09;的密码来确认一个操作。这通常发生在尝试进行某些需要高级权限的系统更改时。 解决方法&#xff1a; 如果你拥有root权限&#xff0…

Ubuntu 如何查看盘是机械盘还是固态盘

在 Ubuntu 系统中&#xff0c;您可以通过以下方法来确定硬盘是机械硬盘&#xff08;HDD&#xff09;还是固态硬盘&#xff08;SSD&#xff09;&#xff1a; 使用 lsblk 命令&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; lsblk -d -o name,rota该命令将列出所…

探索式测试

探索式测试是一种软件测试风格&#xff0c;它强调独立测试人员的个人自由和职责&#xff0c;为了持续优化其工作的价值&#xff0c;将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动&#xff0c;在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…

uniapp 微信小程序内嵌h5实时通信

描述&#xff1a; 小程序webview内嵌的h5需要向小程序实时发送消息&#xff0c;有人说postMessage可以实现&#xff0c;所以试验一下&#xff0c;结果是实现不了实时&#xff0c;只能在特定时机后退、组件销毁、分享时小程序才能接收到信息&#xff08;小程序为了安全等考虑做了…

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…

HOW - Form 表单 label 和 wrapper 对齐场景

一、背景 在日常使用 表单 时&#xff0c;我们一般有如下布局&#xff1a; 可以通过 Form 表单提供的配置直接设置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"输入框"name"…

深入探索AI核心模型:CNN、RNN、GAN与Transformer

在人工智能的飞速发展中&#xff0c;众多深度学习模型和算法不断涌现&#xff0c;推动了许多领域的进步。特别是在图像识别、自然语言处理、生成建模等方向&#xff0c;AI模型的应用越来越广泛。本文将介绍几种最常用的AI模型&#xff0c;包括卷积神经网络&#xff08;CNN&…

樱桃键盘win键按了没反应怎么处理

‌游戏模式‌&#xff1a;部分樱桃键盘在进入游戏模式后会禁用Win键&#xff0c;以防止在游戏过程中误触。可以通过按下Fn F9键来切换游戏模式和办公模式&#xff0c;确保键盘处于办公模式下&#xff0c;Win键即可恢复正常功能。‌ &#xff08;至此我的问题已解决&#xff0c…

解析若依 `R.java` 类——ruoyi-common-core

文章目录 1. 类的整体功能2. 代码解析2.1 成员变量和常量2.2 静态方法构造响应对象2.3 内部私有方法 restResult2.4 工具方法 3. 开发中的应用扩展3.1 接口规范化3.2 快速响应构造3.3 自定义状态码3.4 自定义扩展 R.java 是若依框架中通用的 API 响应封装类&#xff0c;主要用于…

Perl语言的数据结构

Perl语言的数据结构 Perl是一种功能强大的、灵活的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程以及许多其他领域。其灵活性不仅体现在语法上&#xff0c;还体现在其丰富的数据结构上。本文将深入探讨Perl的主要数据结构&#xff0c;包括标量、数组、哈希以及引…