【LeetCode热题100】--287.寻找重复数

news2025/7/13 18:40:15

287.寻找重复数

image-20231017222233676

方法:使用快慢指针

使用环形链表II的方法解题(142.环形链表II),使用 142 题的思想来解决此题的关键是要理解如何将输入的数组看作为链表。 首先明确前提,整数的数组 nums 中的数字范围是 [1,n]。考虑一下两种情况:

  • 如果数组中没有重复的数,以数组 [1,3,4,2]为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n), 其映射关系 n->f(n)为: 0->1 1->3 2->4 3->2 我们从下标为 0 出发,根据 f(n)计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推,直到下标超界。这样可以产生一个类似链表一样的序列。 0->1->3->2->4->null
  • 如果数组中有重复的数,以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n), 其映射关系 n->f(n) 为: 0->1 1->3 2->4 3->2 4->2 同样的,我们从下标为 0 出发,根据 f(n)f(n)f(n) 计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推产生一个类似链表一样的序列。 0->1->3->2->4->2->4->2->…… 这里 2->4 是一个循环,那么这个链表可以抽象为下图:

image-20231017222450115

从理论上讲,数组中如果有重复的数,那么就会产生多对一的映射,这样,形成的链表就一定会有环路了,

综上 1.数组中有一个重复的整数 <–> 链表中存在环 2.找到数组中的重复整数 <–> 找到链表的环入口

至此,问题转换为 142 题。那么针对此题,快、慢指针该如何走呢。根据上述数组转链表的映射关系,可推出 142 题中慢指针走一步 slow = slow.next ==> 本题 slow = nums[slow] 142 题中快指针走两步 fast = fast.next.next ==> 本题 fast = nums[nums[fast]]

class Solution {
    /**
     *  287.数组nums有n+1个整数,均位于[1,n]内,可知至少存在一个重复整数;假设nums中只有一个重复整数,找出该整数
     * 要求:不能修改nums且空间复杂度为O(1)
     * 方法:根据nums构造链表,链表中每个节点既表示nums中下标,又表示nums中值
     *      如[1,3,4,2]对应链表:0->1->3->2->4
     * nums对应的链表中,每个节点的出度都为1,因为nums.length == n+1,所以nums[n]是存在的,
     *      进而链表中第n个节点(尾结点)又会指向一个前驱节点,必定形成环
     *      对于[1,3,4,2,2],链表尾的4号节点又会指向2号节点,形成环,2号节点是环的入口,
     *      其入度又为2,代表着nums中出现了两次2这个取值,因此2就是重复整数
     * 现在,问题就转化成了142题的环形链表入口检测问题
     * */
    public int findDuplicate(int[] nums) {
        int n = nums.length - 1;
        int slow = 0, fast = 0;
        slow = nums[slow]; // 对于本题, slow = slow.next对应于slow = nums[slow]
        fast = nums[nums[fast]]; // fast = fast.next.next对应于fast = nums[nums[fast]]
        
        // 第一阶段:slow与fast相遇,判断成环
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        
        // 第二阶段:找到入环点
        // slow与fast相遇时,假设slow走过的路程是l+b,其中l是slow入环前走过的路程,b是slow入环后走过的路程
        // 假设环的长度为r,则fast走过的路程可以表达为2(l+b)=l+b+k*r,整理后可得l=k*r-b
        // 上述等式意味着,若一个指针p1从链表头开始前进,当他到达环的入口时(走过l的路程),
        // 另一个从slow与fast相遇的位置出发的指针p2也回到了环的入口(走过l=k*r-b的路程),此时二者第一次相遇
        // 因此设置这样两个指针,当p1与p2第一次相遇,即找到了环的入口
        int p1 = 0, p2 = slow;
        while (p1 != p2) {
            p1 = nums[p1];
            p2 = nums[p2];
        }
        
        return p1;
    }
}

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

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

相关文章

如何创建响应式前端表单?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

element ui 下拉框 选择月份和天数

一、背景 目前做的管理系统项目&#xff0c;期望实现功能为&#xff1a;设置出账周期和出账日&#xff0c;考虑使用element ui下拉框实现功能 二、所用技术 vue2element ui 三、实现效果 四、具体代码 <template><popup-frame :title"批量设置出账日" …

【Java基础面试十八】、说一说重写与重载的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说重写与重载的区别…

quartz中jdbc.initialize-schema

never&#xff1a;从不进行初始化&#xff0c;也就是不清空数据库 always&#xff1a;每次都清空数据库进行初始化 embedded&#xff1a;只初始化内存数据库&#xff08;默认值&#xff09;

Fluent瞬态结果的时间统计处理

声明&#xff1a;本文基于 2023R2 版&#xff0c;在其他版本中界面操作、可设置内容等可能存在区别。 1 背景 仿真中有时需要对区域上每个位置的结果数据进行统计分析&#xff0c;例如需要统计设备表面的压力脉动情况&#xff0c;并找出压力脉动最大的位置。在Fluent中对结果…

氮气柜和电子防潮柜物品存储湿度范围介绍

氮气柜和电子防潮柜是常见的两种用于存储特定物品的设备&#xff0c;它们的湿度控制范围和存放物品略有不同。 氮气柜 全范围湿度&#xff1a;1%-60%RH&#xff0c;全自动氮气控制&#xff0c;按需设置1-60%湿度范围。采用微电脑自动感应控制&#xff0c;结合氮气瓶或制氮机使用…

WPS、Excel表格增加一列,序列1到任意大小 / 填充某个范围的数字到列

Excel添加一列递增的数字方法有如下&#xff1a; 一、最常用的&#xff0c;使用鼠标放到右下角下拉增加 1、选中起始框的右下角&#xff0c;直到显示黑色实心十字 2、一直向下拖动 3、成功 这种填充方式是最常用的&#xff0c;100以内都可以轻松瞬间完成 1~100填充 但是如果…

Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图 插件安装 先说 word 文件是docx-preview插件 excel文件是用 xlsx 插件 介绍后端返回的数据 因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含: url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示…

关注用户信息卡片

效果展示 CSS 知识点 box-shadow 属性回顾CSS 变量回顾 实现页面整体布局 <div class"card"><div class"box"><!-- 视频 --><div class"vide_box"><video src"user.mp4" type"video/mp4" aut…

lenovo联想笔记本ThinkPad系列T15p或P15v Gen3(21DA,21DB,21D8,21D9)原厂Win11系统镜像

下载链接&#xff1a;https://pan.baidu.com/s/1V4UXFhYZUNy2ZQ8u4x1AFg?pwdqz0s 系统自带指纹驱动、人脸识别驱动、显卡、声卡等所有驱动、出厂主题壁纸、Office办公软件、Lenovo联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO …

宏电股份RedCap产品亮相迪拜华为MBBF,并参与RedCap全球商用阶段性成果发布

10月10-11日&#xff0c;由华为主办的第十四届全球移动宽带论坛&#xff08;MBBF&#xff09;在阿联酋迪拜成功举办。MBBF期间&#xff0c;华为联合宏电股份等产业伙伴集中发布RedCap商用阶段性成果。本次发布是RedCap产业的关键里程碑&#xff0c;标志着RedCap在全球已具备规模…

Creating parameterized tests with JUnit4

环境 hamcrest-all-1.3 junit-4.13.2 被测类 package com.yaya.junit;public class Factorial {public long factorial(long number) {if(number 0) {return 1;}return number*factorial(number-1);} }测试类一&#xff1a;使用构造函数 package com.yaya.junit;import org.…

38.迪杰斯特拉(Dijkstra)算法

概述 我们在上一篇中面对修路的问题讲述了普利姆算法的实现方式&#xff0c;本篇我们参照迪杰斯特拉算法来对修路问题做进一步拆解。 我们回顾一下之前的问题&#xff1a; “要想富&#xff0c;先修路”&#xff0c;郝乡长最近为了德胜乡修路的事情愁白了头。 得胜乡有A、B、C…

上采样相关技术

一、参考资料 上采样和上卷积的区别 怎样通俗易懂地解释反卷积&#xff1f; 卷积和池化的区别、图像的上采样&#xff08;upsampling&#xff09;与下采样&#xff08;subsampled&#xff09; [读论文]用全卷积Res网络做深度估计 对抗生成网络GAN系列——DCGAN简介及人脸图像生…

TCP通信-快速入门

TCP通信模式演示 注意&#xff1a;在java中只要是使用java.net.Socket类实现通信&#xff0c;底层即是使用了TCP协议。 Socket api public Socket(String host , int port) 创建发送端的Socket对象与服务端连接&#xff0c;参数为服务端程序的ip和端口。 OutputStream getO…

[PyTorch]即插即用的热力图生成

先上张效果图&#xff0c;本来打算移植霹雳老师的使用Pytorch实现Grad-CAM并绘制热力图。但是看了下代码&#xff0c;需要骨干网络按照标准写法&#xff08;即将特征层封装为features数组&#xff09;&#xff0c;而我写的网络图省事并没有进行封装&#xff0c;改造网络的代价又…

大数据Flink(九十八):SQL函数的归类和引用方式

文章目录 SQL函数的归类和引用方式 一、SQL 函数的归类

算法、推理、部署,面了40多个大佬的感想

今年三月份到现在陆陆续续面了40来个人&#xff0c;有实习生&#xff0c;有校招生&#xff0c;也有来社招的大佬们。面了挺久&#xff0c;有些总结和感想&#xff0c;发出来和大家交流交流&#xff0c;也趁着这个机会为之后参与校招的同学提供一些学习方向。 我面的岗位主要是…

【STL】平衡二叉树

前言 对于之前普通的二叉搜索树&#xff0c;其搜索的效率依靠树的形状来决定&#xff0c;如下&#xff1a; 可以看到 A图 中的树比较彭亨&#xff0c;搜索一个元素的效率接近 O(logN) &#xff1b;而 B图 中的形状也符合搜索二叉树&#xff0c;但是很不平衡&#xff0c;这时的…

SamSung三星笔记本NP930QCG-K02CN原装出厂OEM预装Win10系统

下载链接&#xff1a;https://pan.baidu.com/s/13GsR_r9caJkLjiWWaXa30Q?pwdncp9 系统自带指纹驱动、声卡,网卡,显卡等所有驱动、三星出厂时主题壁纸、系统属性三星专属LOGO标志、Office办公软件等三星出厂时自带的预装程序 由于时间关系,绝大部分资料没有上传&#xff0c;不…