【leetcode】寻找重复数

news2025/1/13 6:07:37

题目链接:寻找重复数icon-default.png?t=N176https://leetcode.cn/problems/find-the-duplicate-number/

方法一:快慢指针

因为只有一个数字是重复的,且一个数字正好对应一个唯一的下标,所以可以将数组抽象为一个链表,假定数组为{1,2,3,4,5,6,3} --> {1,2,3,4,5,6},{3,4,5,6},{3,4,5,6}...

 

slow一次走一步,fast一次走两步,那么当slow与fast相遇的时候,必定是在环内的某一个位置,假设slow走了n步,fast就走了2n步。假设数组首部到环入口的距离为m,那么slow在环内走了n-m的长度, fast走了2n-m个长度,

则有 2n-m = k(n-m) (k != 0)

不妨设 n - m = c 则可知 n%c == 0

现在slow走了n-m步,让slow再走m步就会到达环的入口(n%c == 0),而m正是起点到环入口的距离。

代码

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        //快慢指针
        //当出现相同的数字时,会形成类似于链表中的环。
        int fast = 0,slow = 0;
        while(true)
        {
            fast = nums[nums[fast]];//fast一次走两步
            slow = nums[slow];//slow一次走一步
            if(fast == slow)//两个节点下相遇,必定是在环内部。
                break;
        }
        //当finder == slow时就是环的入口
        //为什么finder和slow相遇的时候,就是入口?
        /*假定slow 和 fast 相遇时,fast走了2n步,slow走了n步 环长度为c 起点至环入口就是m则有
        n%c == 0  n - m 为slow走的距离,当slow再走一个m时,就到环的入口,而m正是起点到环入口的距离*/
        int finder = 0;
        while(true)
        {
            finder = nums[finder];
            slow = nums[slow];
            if(slow == finder) break;
        }
        return slow;
    }
};

方法二:二分查找

假定数组q[] = {1,2,3,4,4} q.size() = 5  区间[1,4]

小于等于 1 的数字个数为 1 (1)
小于等于 2 的数字个数为 2 (1、2)
小于等于 3 的数字个数为 4 (1、2 、3)
小于等于 4 的数字个数为 4 (1、2、3、4、4)

可以看到左边的数集合严格小于自身,右边的数集合严格大于自身。当集合中的个数cnt > 指定的数字时,就会出现重复数字。

二分的思想时,当出现一个条件可以使得左半边的数字严格与右半边的数字出现分割就行。

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int l = 0,r = nums.size()-1;
        while(l < r)
        {
            int mid = l + r >> 1;
            int cnt = 0;
            for(int i = 0;i < nums.size();i++)
            {
                if(nums[i] <= mid)
                {
                    cnt++;
                }
            }
            //当出现从cnt > mid 就说明mid的左半部分出现了重复的数字,使得计数大于mid
            //重复的数字在[l,mid]
            if(cnt > mid) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};

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

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

相关文章

Java内置队列和高性能队列Disruptor

一、队列简介 队列是一种特殊的线性表&#xff0c;遵循先入先出、后入后出&#xff08;FIFO&#xff09;的基本原则&#xff0c;一般来说&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作&#xff0c;但是java的某些队列运行在任何地方插入删…

拆解钉钉流程审批功能:卡片式配置的审批流是怎样设计的?

有个客户要求我们做个定制开发&#xff0c;客户觉得钉钉的操作体验比较不错&#xff08;用户使用的惯性&#xff09;&#xff0c;要求我们要实现钉钉的自动配置审批流程&#xff0c;不过幸不辱命&#xff0c;对比个钉钉的流程审批、表单配置的相关功能&#xff0c;做了个Java私…

世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!

世界上最流行的编程语言是什么&#xff1f; Python? Java? JavaScript? C&#xff1f;都不是&#xff0c;是Excel&#xff01;外媒估计&#xff0c;全球有12亿人使用微软的Office套件&#xff0c;其中估计有7.5亿人使用Excel&#xff01;可是Excel不就是能写点儿公式&#x…

华为OD机试题【合并数组】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明合并数…

计算机组成原理4小时速成:五大组成部分:运算器,控制器,存储器,输入设备输出设备

计算机组成原理4小时速成&#xff1a;五大组成部分&#xff1a;运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备输出设备 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&am…

BOSHIDA AC-DC电源模块基本原理及常见问题

BOSHIDA三河博电科技 AC-DC电源模块基本原理及常见问题 AC/DC电源模块的基本原理是从交流源中获取电压,然后由整流器转换为直流电压,且输出能量比输入的电压高,从而达到电路输出直流电压、电流的目的。 交流交换器模块由负责控制的设备,整流器,电容器和变压器组成。负责控制的设…

恢复谷歌翻译的究极方法

谷歌翻译为什么会失效&#xff0c;我想各位在去年11月的时候就知道了。可是要怎么解决失效的问题呢&#xff1f;之前我们是通过手动Ping可以连接的ip各位可能觉得麻烦&#xff0c;心里觉得什么档次还要我手动ping就没有可以自动扫描的吗&#xff1f;还别说真的有我最近发现一个…

GVINS论文中关于GNSS的基础知识

1.GNSS发射信号的组成 卫星所发射的信号可分为三个层次&#xff1a;载波(Carrier signal)、伪码(PRN code伪码中的一种)和数据码(Navigation message)。在这三个层次中&#xff0c;伪码和数据码一起先通过调制依附在正弦波形式上的载波&#xff0c;然后卫星将调制后的载波信号…

外贸建站,为什么别人的询盘更多更精准?

大多企业进行外贸建站的目的就是想要获得更多的精准询盘&#xff0c;但是具体该如何做&#xff0c;大多企业都没有方向&#xff0c;要么就是在网上看各种不系统的文章学着操作&#xff0c;要么就找个建站公司做好网站就不管了&#xff0c;而最终结果都不甚理想。那么怎样才能让…

The KINGDOM Software 32-bit导入segy数据

说明 1、软件&#xff1a;The KINGDOM Software 32-bit 2、电脑系统&#xff1a;win10 3、操作&#xff1a;导入segy数据&#xff08;如果读者没有数据&#xff0c;可使用下面会用到的示例数据&#xff09; 步骤 1、打开kingdom软件&#xff0c;找到最上面菜单栏的“surve…

php学习笔记 安装XAMPP hbuilder配置

PHP7.0编程 基础配置 Download XAMPP (apachefriends.org) 下载XAMPP&#xff0c;修改端口如图 网站根目录的默认路径&#xff1a;xampp\htdocs。MySQL数据库默认路径&#xff1a;xampp\mysql\data。 XAMPP的默认密码如下。 ●MySQL。User&#xff1a;root&#xff1b;Pas…

项目管理工具dhtmlxGantt甘特图入门教程(十五):从MS项目导入/导出(中)

这篇文章给大家讲解利用dhtmlxGantt导入MS项目。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764148812&#xff09;https…

【Java爬取赛事网站】命令行输出(仅供学习)

Java爬取赛事网站 参与社区的问题回答 问题回答这个作业属于哪个课程软件工程-23年春季学期这个作业要求在哪里软件工程实践第二次作业—文件读取这个作业的目标完成对澳大利亚网球公开赛相关数据的收集&#xff0c;并实现一个能够对赛事数据进行统计的控制台程序其他参考文献…

Kafka-Kraft 模式架构部署

Kafka-Kraft 模式架构部署 Kafka网址&#xff1a;https://kafka.apache.org/ PS&#xff1a;因环境原因此文档内端口都有修改&#xff01; 1.去官网下载二进制包 PS&#xff1a;3.4.0是目前最新的版本&#xff01;需要jdk1.8及以上版本启动。 [rootk8s-node1 ~]# wget https:/…

Linux下各种锁的理解和使用及总结解决epoll惊群问题(面试常考)

一.锁 锁出现的原因 临界资源是什么: 多线程执行流所共享的资源 锁的作用是什么, 可以做原子操作, 在多线程中针对临界资源的互斥访问... 保证一个时刻只有一个线程可以持有锁对于临界资源做修改操作... 任何一个线程如果需要修改&#xff0c;向临界资源做写入操作都必须持…

如何在 Primavera P6 中使用赢得值/挣值管理

目录 演示案例 如何在Primavera中绘制EVM图&#xff1f; 你是否想过如何在Primavera P6调度工具中应用挣值管理&#xff1f; 事实上&#xff0c;Primavera P6 能够使用挣值管理技术来控制项目进度和绩效&#xff0c;将项目成本与项目进度整合起来 演示案例 我们以一个简单…

JVM方法区详解有这篇就够了

1、方法区在哪里《Java虚拟机规范》中明确说明&#xff1a;“尽管所有的方法区在逻辑上是属于堆的一部分&#xff0c;但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言&#xff0c;方法区还有一个别名叫做Non-Heap&#xff08;非堆&#xff09…

记录面试问题

以下问题不分先后&#xff0c;按照印象深浅排序&#xff0c;可能一次记录不完成&#xff0c;后面想起来会及时补充&#xff0c;如有不对&#xff0c;恳请各位围观大佬多多指教&#x1f64f; 印象最深的是一道很简单很简单的题目&#xff0c;我结束面试之后赶紧代码敲敲发现答错…

简易计算器-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

【案例11-2】 简易计算器 【案例介绍】 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。 2.运行结果 运行结果 【案例分析】 要制作一个计算器&#xff0c;首先要知道它由哪些部分组成&#xff0c;如下图所示&#xff1a; 一…

见山,见路,见天地:OpenHarmony的开源共建攀登

自诞生之日起&#xff0c;OpenHarmony就引起着各方的关注&#xff0c;可谓是盛况空前。但一款开源操作系统的成功&#xff0c;困难不在第一步&#xff0c;而是第一步后面的一万步。那么&#xff0c;踏出开源第一步之后的OpenHarmony&#xff0c;后面的故事如何发展了呢&#xf…