【LeetCode力扣】287.寻找重复数

1、题目介绍

原题链接:287. 寻找重复数 - 力扣(LeetCode)

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 105
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

2、解题

2.1、解题思路

当我们用一个指针 i=0 以 i = nums[i]; 的方式遍历数组nums[ ]后可以得到图1,因为数组nums[ ]中一定存在的重复的数字 target,所以 target=( 6 ) 这个位置一定有起码两条指向它的边,因此整张图一定存在环,且我们要找到的 target就是这个环的入口,同时也是这道题的答案。用这种方法需要对「Floyd 判圈算法」有所了解。

「Floyd 判圈算法」(又称龟兔赛跑算法),可用于判定链表、迭代函数、有限状态机中是否有环。如果有环,可以找出环的起点,求出环的长度。 

基本思想:利用了快慢指针的思想。比如两个人在赛跑,A速度快,B速度慢,若是存在环(勺状图),A和B总是会相遇的,相遇时A所经过的路径的长度要比B多若干个环的长度。

  • 算法时间复杂度:令S到P的距离为m,环的长度为n,时间复杂度O(m+n),即O(n);
  • 空间复杂度:O(1);

图1: 

​ 

2.2、图解说明

定义两个指针,分别是慢指针slow和快指针fast。

一开始让两个指针都指向下标0,然后两个指针每次指向的下一个下标为数组里当前下标的值,slow指针每次进行一次指向下一个下标的操作,fast指针每次进行两次指向下一个下标的操作;

即:slow = nums[ slow ] ;   fast = nums[ nums[ fast ] ] ;

然后判断slow 是否等于fast,即:while(slow != fast)

根据「Floyd 判圈算法」,两个指针在有环的情况下一定会相遇,所以当两个指针在环里面相遇的时候我们再将 slow指针 放置起点 0,两个指针每次同时移动一步,相遇的点就是答案(即环的入口)。

 ​​​

这时候让slow等于4,fast等于4然后fast再等于6,即:slow = nums[ slow ] ;   fast = nums[ nums[ fast ] ] ; 所以slow = 4 不等于fast = 6

这时候让slow等于6,fast等于3然后fast再等于6,即:slow = nums[ slow ] ;   fast = nums[ nums[ fast ] ] ; 所以slow = 6 等于fast = 6

这时候我们将 slow指针放置起点 0,两个指针每次同时移动一步

这时候slow=fast等于6 ,所以返回答案6

2.3、解题代码

class Solution {public int findDuplicate(int[] nums) {int slow = 0, fast = 0;do{slow = nums[slow];fast = nums[nums[fast]];} while(slow != fast);slow = 0;while(slow != fast){slow = nums[slow];fast = nums[fast];}return slow;}
}

时间复杂度:O(n)O(n)O(n)。「Floyd 判圈算法」时间复杂度为线性的时间复杂度。

空间复杂度:O(1)O(1)O(1)。我们只需要常数空间存放若干变量。

 【LeetCode力扣】相关:

【LeetCode力扣】11. 盛最多水的容器 (中等)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134102596?spm=1001.2014.3001.5502【LeetCode力扣】70. 爬楼梯 (简单)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134033485?spm=1001.2014.3001.5502【LeetCode力扣】86.分隔链表-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/133972240?spm=1001.2014.3001.5502

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

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

相关文章

Hadoop环境搭建及Demo

参考博客 Windows 10安装Hadoop 3.3.0教程 (kontext.tech) Hadoop入门篇——伪分布模式安装 & WordCount词频统计 | Liu Baoshuai’s Blog Hadoop安装教程 Linux版_linux和hadoop的安装_lnlnldczxy的博客-CSDN博客 hadoop启动出错 The value of property bind.address …

idea中配置spring boot单项目多端口启动

参照文章 https://zhuanlan.zhihu.com/p/610767685 项目配置如下 下面为 idea 2023&#xff0c;不同版本的设置有区别&#xff0c;但是没那么大&#xff0c;idea 2023默认使用新布局&#xff0c;切换为经典布局即可。 在项目根目录的.idea/workspace.xml文件里添加如下配置 &l…

学电脑编程零基础,计算机编程入门先学什么

学电脑编程零基础&#xff0c;计算机编程入门先学什么&#xff0c;建议先从容易学习的语言入手&#xff0c;比如中文编程。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&…

Java之图书管理系统

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家分享一下Java实现一个简易的图书管理系统&#xff01; 清风的个人主页&#x1f389;✏️✏️ &#x1f302;c/java领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&…

用于 GaN-HEMT 功率器件仿真的 TCAD 方法论

目录 标题&#xff1a;TCAD Methodology for Simulation of GaN-HEMT Power Devices来源&#xff1a;Proceedings of the 26th International Symposium on Power Semiconductor Devices & ICs(14年 ISPSD)GaN-HEMT仿真面临的挑战文章研究了什么文章的创新点文章的研究方法…

JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构

一、源码特点 JSP 学生成绩查询管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;比较流行的servlet框架系统具有完整的源代码和数据库&#xff0c;eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接…

LeetCode 热题100——链表专题

一、俩数相加 2.俩数相加&#xff08;题目链接&#xff09; 思路&#xff1a;这题题目首先要看懂&#xff0c;以示例1为例 即 342465807&#xff0c;而产生的新链表为7->0->8. 可以看成简单的从左向右&#xff0c;低位到高位的加法运算&#xff0c;4610&#xff0c;逢…

5.4 删除字符串中的所有相邻重复项(LC1047-E)

算法&#xff1a; 相对于20. 有效的括号 (opens new window)来说其实也是匹配问题&#xff0c;20. 有效的括号 是匹配左右括号&#xff0c;本题是匹配相邻元素&#xff0c;最后都是做消除的操作。 本题也是用栈来解决的经典题目。 那么栈里应该放的是什么元素呢&#xff1f;…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

安全防御——二、ENSP防火墙实验学习

安全防御 一、防火墙接口以及模式配置1、untrust区域2、trust区域3、DMZ区域4、接口对演示 二、防火墙的策略1、定义与原理2、防火墙策略配置2.1 安全策略工作流程2.2 查询和创建会话 3、实验策略配置3.1 trust-to-untrust3.2 trust-to-dmz3.3 untrust-to-dmz 三、防火墙的区域…

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执…