码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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、解题代码

    1. class Solution {
    2. public int findDuplicate(int[] nums) {
    3. int slow = 0, fast = 0;
    4. do{
    5. slow = nums[slow];
    6. fast = nums[nums[fast]];
    7. } while(slow != fast);
    8. slow = 0;
    9. while(slow != fast){
    10. slow = nums[slow];
    11. fast = nums[fast];
    12. }
    13. return slow;
    14. }
    15. }

    ​

    时间复杂度: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

    ​

  • 相关阅读:
    JVM虚拟机(1)- 内存结构
    分布式爬虫
    [附源码]Java计算机毕业设计SSM高校餐厅评价系统
    Web前端框架:深入探索与实践
    Apache-atlas-kafka-hook-源码分析
    ti代理商:好的ti代理商有哪些分销
    121. 一键部署开箱即用的代理服务器,解决 SAP UI5 应用开发过程中访问远端 OData 服务的跨域问题
    一次logstash的实践解锁了如此多的玩法....
    数据库:什么是数据库,有哪些数据库,数据库用来干什么,图导,拓展
    dbLinq最新版linq sqlite
  • 原文地址:https://blog.csdn.net/m0_65277261/article/details/134232926
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号