
这一题的思路非常诡异,并非位运算。而是https://blog.youkuaiyun.com/chaochen1407/article/details/43925201
该怎么理解呢。因为原题目是在n + 1个元素里面只有1 ~ n这个范围的数,也就是每个元素都可以是一个合法的数组的index。换一个思路去想这可以是一个模拟的list。举个例子,在第一个例子里。1,3,4,2,2,如果把它转换成一个虚拟的链表,将会是0 -> 1 -> 3 -> 2 -> 4 -> 2 -> 4 -> 2.....这就是一个循环链表。再看第二个例子,0 -> 3 -> 4 -> 2 -> 3 -> 4 -> 2...这最后也变成了一个循环链表。我自己再设一个例子, 1, 2, 3 ,4 ,5 ,2 这样。就会变成 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 2 -> 3 -> 4 ....
之所以会产生这种情况是因为这样转换成一个链表的形式的时候,因为有duplicate number,所以最后肯定会产生的情况是某个index对应的节点有不少于两个别的节点指向它,所以最后必然会形成一个环。这就是这种链表模拟做法能够成立的原因。
给出代码如下:
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;
}
大家可以对比一下上面那个link的代码,基本是一致的
其实类似的题目我还想到了这个:https://blog.youkuaiyun.com/chaochen1407/article/details/43230993 不过做法完全不同,仅供对比和参考。
549

被折叠的 条评论
为什么被折叠?



