首页 > 其他分享 >287. 寻找重复数

287. 寻找重复数

时间:2023-10-19 15:02:40浏览次数:36  
标签:slow nums 重复 入口 寻找 fast 相遇 finder 287

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。


示例 1:

输入:nums = [1,3,4,2,2]
输出:2

思路

可以考虑用环形链表的思路

[1,n]区间,没有索引0,所以环的入口不可能在index=0,所以起点一定不在环中。 所以当出现环时 环的入口就为重复的元素


如上图,slow 和 fast 会在环中相遇,先假设一些量:起点到环的入口长度为 m,环的周长为 c,在 fast 和 slow 相遇时 slow 走了 n 步。则 fast 走了 2n 步,fast 比 slow 多走了 n 步,而这 n 步全用在了在环里循环(n%c==0)。 当 fast 和 last 相遇之后,我们设置第三个指针 finder,它从起点开始和 slow(在 fast 和 slow 相遇处)同步前进,当 finder 和 slow 相遇时,就是在环的入口处相遇,也就是重复的那个数字相遇。

为什么 finder 和 slow 相遇在入口
fast 和 slow 相遇时,slow 在环中行进的距离是 n-m,其中 n%c0。这时我们再让 slow 前进 m 步——也就是在环中走了 n 步了。而 n%c0 即 slow 在环里面走的距离是环的周长的整数倍,就回到了环的入口了,而入口就是重复的数字。 我们不知道起点到入口的长度 m,所以弄个 finder 和 slow 一起走,他们必定会在入口处相遇。


class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        
        int fast = 0, slow = 0;
        while(true){
            fast = nums[nums[fast]];
            slow = nums[slow];
            if(fast == slow)
                break;
        }
        int finder = 0;
        while(true){
            finder = nums[finder];
            slow = nums[slow];
            if(slow == finder)
                break;        
        }
        return slow;
    }
};

标签:slow,nums,重复,入口,寻找,fast,相遇,finder,287
From: https://www.cnblogs.com/lihaoxiang/p/17774702.html

相关文章

  • 研发日常踩坑-Mysql分页数据重复 | 京东云技术团队
    踩坑描述:写分页查询接口,orderby和limit混用的时候,出现了排序的混乱情况在进行第N页查询时,出现与第一前面页码的数据一样的记录。问题在MySQL中分页查询,我们经常会用limit,如:limit(0,20)表示查询第一页的20条数据,limit(20,20)表示查询第二页的数据。业务上我们通常也会在分页的时......
  • 26. 删除有序数组中的重复项
    目录1.题目法一、双指针法二、利用集合的去重特性1.题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。示例1:输入:nums=[1,1,2]输出:2,......
  • C# M2Mqtt组件连接失败后占用大量cpu不释放以及重复用一个client进行重连会出现假连接
    M2Mqtt是C#的一个mqtt客户端库,这个库很好用,但是它有严重的Bug当我们调用Connect建立连接时,如果身份认证失败,它会返回状态码3,即"连接已拒绝,不合格的客户端标识符",但是其内部的异步线程并不会终止,依然会占用大量的cpu资源,即使Disconnect且把client置为null也没用,除非彻底关闭程序......
  • 请完善课上的口算题卡代码,实现重复题目的检测、题目数字范围、加减乘除算式的参数化等
    importjava.util.HashSet;importjava.util.Random;importjava.util.Set;publicclassMathQuizGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//设定生成题目的数量    intminNumber=1;//题目数字的最小值 ......
  • 彻底搞懂:防止表单重复提交,前端限制还是后端限制?
    欢迎大家来到小米的技术分享专栏!今天我将为大家带来一个热门话题:如何有效地防止表单重复提交。在开发中,我们常常会遇到这样的问题:用户频繁点击提交按钮,导致数据重复提交,给系统和用户体验带来不必要的困扰。那么,在前端还是后端进行限制措施,哪个更好呢?让我们一起深入探讨。前端限制:防......
  • [python] 使用nmap搜索主机及端口号:寻找宿舍路由
    prologue明明设置好了端口映射,但出来却发现无法远程连接宿舍的电脑,怀疑是路由器WAN网口地址变动idea很神奇的是原ip能ping通,不过也可能是被分配给其他宿舍,尝试了telnet,无果。上网搜索发现了netcat,又看到了nmap,似乎更合适solution安装好nmap,计划是先扫描主机,再扫描在线主机的2......
  • SolidWorks 学会随配合复制,装配重复零件快人一步
    我们在装配体设计中,经常会碰到同一个零件多次装配的情况,比如下图中的支撑柱,本文给大家分享SolidWorks中一个非常不错的功能随配合复制,让你快速装配重复零件。随配合复制使用方法:1.选择需要复制的零件,右击鼠标选择随配合复制,操作如下图; 2.然后选择下一步,操作如下图; 3.复制......
  • SQL Server数据库多种方式查找重复记录
    示例:表stuinfo,有三个字段recno(自增),stuid,stuname 建该表的Sql语句如下: CREATETABLE[StuInfo]([recno][int]IDENTITY(1,1)NOTNULL,[stuid][varchar](10)COLLATEChinese_PRC_CI_ASNOTNULL,[stuname][varchar](10)COLLATEChinese_PRC_CI_ASNOTNULL)ON[PRIMAR......
  • VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点
    判断一个点,判断是否在风格stl模型内部,或表面:目录1.方案一:使用vtkCellLocator  FindClosestPoint找到模型上距离给定点最近的一点,计算两点的距离,小于某一阈值则认为此点在模型上;2.方案二使用vtkKdTreePointLocator3.方案三使用vtkSelectEnclosedPoints1.方案一:使用vtk......
  • 2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它
    2023-10-14:用go语言,给定pushed和popped两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入push和弹出pop操作序列的结果时,返回true;否则,返回false。输入:pushed=[1,2,3,4,5],popped=[4,5,3,2,1]。输出:true。来自美团。来自左程云。答案2023-10-......