【LeetCode力扣】287.寻找重复数(中等)

2023-11-06 14:20

本文主要是介绍【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

这篇关于【LeetCode力扣】287.寻找重复数(中等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/357135

相关文章

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &