java数据结构与算法刷题-----LeetCode287. 寻找重复数

这篇具有很好参考价值的文章主要介绍了java数据结构与算法刷题-----LeetCode287. 寻找重复数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode

解题思路

弗洛伊德判圈法,也就是快慢指针判圈法(龟兔赛跑算法),此算法分为两个步骤

  1. 判断是否有环,并得到快慢指针相遇的结点:慢指针每次走一格,快指针每次走两格,只要有环,必然会相遇。
  2. 获取构成环的结点:相遇后,让慢指针归0,快指针继续呆在相遇的地方,然后两个人依次一格一格的后移,最终再次相遇的地方,就是构成环的地方。
本题是数组题,如何想到用环形链表的解法呢?
  1. 首先,这个题的数组,下标范围和取值范围是几乎相同的。因为下标范围在0 ~ n。取值范围是1 ~ n。那么下标和元素值是可以联立的。我们可以设置链表结点为[下标,元素值]来构成链表。因为有重复的元素值,那么这个链表比如有环,图解如下:
    java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode
  2. 既然抽象出了链表,就可以使用弗洛伊德判圈法,先判断是否有环,然后获取相遇结点位置。下面给出两个例子

java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode
java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode
java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode
java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode

  1. 获取了相遇结点后,接下来就是慢指针归0,快指针继续在相遇的结点。然后两个指针依次一格一格的后移即可。图解如下
    java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode
代码:时间复杂度O(n) 空间复杂度O(1)

java数据结构与算法刷题-----LeetCode287. 寻找重复数,算法,java,开发语言,算法,leetcode文章来源地址https://www.toymoban.com/news/detail-821993.html

class Solution {
    public int findDuplicate(int[] nums) {
        int slow = 0, fast = 0;//快慢指针
        //将数组转换为链表,nums数组下标作为链表结点。对应下标的元素值作为指向下一个结点的指针
        //因此,只要数组中有重复元素,那么这个链表一定有环
        do{
            slow = nums[slow];//相当于 slow = slow.next
            fast = nums[nums[fast]];//相当于fast = fast.next.next;
        }while(slow != fast);//找到环,并指向相遇结点
        //然后slow归0,fast不变,依次后移,找到构成环的结点
        slow = 0;//slow归0
        while(slow != fast){//一格一格的后移,直到再次相遇,就是环的入口
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;//最终返回这个结点值
    }
}

到了这里,关于java数据结构与算法刷题-----LeetCode287. 寻找重复数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java数据结构与算法刷题-----LeetCode240. 搜索二维矩阵 II

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 法一:把整个数组遍历一遍,时间复杂度O(m*n) 法二:每一行用二分搜索,那么时间复杂度就是O(m * l o g 2 n log_2{n} l o g

    2024年01月22日
    浏览(58)
  • java数据结构与算法刷题-----LeetCode209. 长度最小的子数组

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 代码:时间复杂度O(n).空间复杂度O(1)

    2024年01月21日
    浏览(51)
  • java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只

    2024年01月21日
    浏览(52)
  • java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序,可以用二分搜索,不过和一维数组排序不同,这是二维的 每一行都递增,每一列也是递增,所以每

    2024年01月23日
    浏览(49)
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 双分裂蛇:是求二维表中从起点到终点的经典思路(也是求无权图的最短路径问题的经典解法)。创建两条分裂蛇,分别从起点和

    2024年04月26日
    浏览(48)
  • 数据结构算法leetcode刷题练习(1)

    给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标

    2023年04月24日
    浏览(50)
  • 【LeetCode】287.寻找重复数

    给定一个包含  n + 1  个整数的数组  nums  ,其数字都在  [1, n]  范围内(包括  1  和  n ),可知至少存在一个重复的整数。 假设  nums  只有  一个重复的整数  ,返回  这个重复的数  。 你设计的解决方案必须  不修改  数组  nums  且只用常量级  O(1)  的额外空间。

    2024年02月14日
    浏览(32)
  • 【LeetCode】287. 寻找重复数

    思路 要解决这道题首先要理解如何将输入的数组看作为链表。对于数组 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) 计算出一个值,

    2024年02月14日
    浏览(36)
  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(50)
  • LeetCode 刷题 数据结构 链表 203 移除链表元素

    Given the  head  of a linked list and an integer  val , remove all the nodes of the linked list that has  Node.val == val , and return  the new head . Example 1: Example 2: Example 3: Constraints: The number of nodes in the list is in the range  [0, 104] . 1 = Node.val = 50 0 = val = 50 今天leetcode的中文官网比较卡,所以是登录官网进行

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包