Find the Duplicate Number【287】
2015-10-03 22:00
218 查看
网上解法,学习用
public int findDuplicate(int[] nums) {
int n = nums.length;
int slow = n;
int fast = n;
do{
slow = nums[slow-1];
fast = nums[nums[fast-1]-1];
}while(slow != fast);
slow = n;
while(slow != fast){
slow = nums[slow-1];
fast = nums[fast-1];
}
return slow;
}
附上此解解题思路:
1). 使用快慢指针法,若链表中有环,可以得到两指针的交点M 2). 记链表的头节点为H,环的起点为E 2.1) L1为H到E的距离 2.2) L2为从E出发,首次到达M时的路程 2.3) C为环的周长 2.4) n为快慢指针首次相遇时,快指针在环中绕行的次数 根据L1,L2和C的定义,我们可以得到: 慢指针行进的距离为L1 + L2 快指针行进的距离为L1 + L2 + n * C 由于快慢指针行进的距离有2倍关系,因此: 2 * (L1+L2) = L1 + L2 + n * C => L1 + L2 = n * C => L1 = (n - 1)* C + (C - L2) 可以推出H到E的距离 = 从M出发绕环到达E时的路程 因此,当快慢指针在环中相遇时,我们再令一个慢指针从头节点出发 接下来当两个慢指针相遇时,即为E所在的位置
参考LeetCode Discuss(https://leetcode.com/discuss/16567/concise-solution-usi
相关文章推荐
- 基础知识点
- php第五章
- Java多线程实验
- 项目自动化工具Ant和Maven初探
- php第四章
- php第三章
- php第二章
- php第一章
- C打印函数printf的一种实现原理简要分析
- Spring DI 继承
- php设计模式之观察者模式
- C打印函数printf的一种实现原理简要分析
- Photoshop设计时尚绚丽的电影海报教程
- bzoj1529【poi005】ska Piggy banks
- 如何解决U盘拷贝时提示文件过大问题
- Windows 7 64位PL/SQL Developer 连接Oracle 11g
- UVALive 4727 Jump(约瑟夫环,递推)
- 汤姆猫—帧动画
- ISMAR 2015 Poster - Remote Mixed Reality System Supporting Interactions with Virtualized Objects
- Android Studio新建Module时弹出窗口显示不全的问题