
我只会用哈希表............
技巧题真的做不了一点............
看了答案也只看懂一个循环,大概是利用查找链表中循环的那个思路。每个节点设置一条i->nums[i]的边,数组中有重复数字就代表必定有环,并且那个重复数字必定在环里面。
几个问题:
①为什么必定有环?
因为有一个数字nums[i]重复,那么这个数字就一定被两个节点指向,而这个i就是那个重复数字。
②怎么查找这个重复的i?
用之前在链表中寻找环入口的方法,双指针,之前证明过了。
cpp
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int fast=nums[nums[0]];
int slow=nums[0];
while(nums[fast]!=nums[slow]){
fast=nums[nums[fast]];
slow=nums[slow];
}
slow=0;
while(nums[fast]!=nums[slow]){
fast=nums[fast];
slow=nums[slow];
}
return nums[fast];
}
};
总之真的挺奇妙的,居然可以用链表的方法解,明明是看似无关的两题......