查看: 919| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 287. Find the Duplicate Number 怎么证明环的

全局:
高频题

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
如题,怎么可以证明他有环呢

感觉大家可以用这个解法怎么去理解呢:

  1. class Solution {
  2.     public int findDuplicate(int[] nums) {
  3.         // Find the intersection point of the two runners.
  4.         int tortoise = nums[0];
  5.         int hare = nums[0];
  6.         do {
  7.             tortoise = nums[tortoise];
  8.             hare = nums[nums[hare]];
  9.         } while (tortoise != hare);

  10.         // Find the "entrance" to the cycle.
  11.         int ptr1 = nums[0];
  12.         int ptr2 = tortoise;
  13.         while (ptr1 != ptr2) {
  14.             ptr1 = nums[ptr1];
  15.             ptr2 = nums[ptr2];
  16.         }

  17.         return ptr1;
  18.     }
  19. }
复制代码

上一篇:23 merge k sorted list
下一篇:终于刷穿了SQL
🔗
usr_opta 2020-10-10 14:57:50 | 只看该作者
全局:
每个节点都有后继节点,于是你可以无限走下去,但是总的节点数量是有限的,于是你在某个时刻必定访问一个已经访问过的节点(i.e. 环)。
回复

使用道具 举报

🔗
usr_opta 2020-10-10 15:03:23 | 只看该作者
全局:
但是你并不想你的访问链就是一整个环,这意味着这个链里的每个节点恰好都只有一个前继节点。于是你从0开始,因为0没有前继节点。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表