题目的链接在这里:https://leetcode-cn.com/problems/find-the-duplicate-number/
题目大意
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。
一、示意图
二、解题思路
hash表
HashSet
代码如下:
class Solution {
public int findDuplicate(int[] nums) {
//简单一点的做法就是使用hash表
HashSet<Integer> hashSet=new HashSet<>();
for(int n:nums){
if(hashSet.contains(n)){
return n;
}else{
hashSet.add(n);
}
}
return 0;
}
}
数组排序
代码如下:
class Solution {
public int findDuplicate(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]){
return nums[i];
}
}
return 0;
}
}
快慢数组
代码如下:
class Solution {
public int findDuplicate(int[] nums) {
//所以这道题的难点首先第一个是 如何把num设置成一个链表
//其次就是使用这个快慢指针
int slow=0;
int fast=0;
//首先要知道 这个题一定是有环的,其次使用这个下面的方法是因为所有的值都在目标范围内
//相当于需要知道两次相遇的情况
//然后进行初始化
//slow是步数加一就变成了 第一个数的下标 而fast是加二的话 就变成了当前0的数值对应的位置的数值了
//相当于是next
slow=nums[slow];
//相当于是next的next
fast=nums[nums[fast]];
//然后就开始进行while判断
while (slow!=fast){
//那就正常进行走路
//相当于是next
slow=nums[slow];
//相当于是next的next
fast=nums[nums[fast]];
}
//然后这里一旦出现第一次相遇的时候 就需要进行初始化了
//把fast变到原来的位置 然后让他速度变成和slow一样
fast=0;
while (fast!=slow){
//相当于是next
slow=nums[slow];
//相当于是next
fast=nums[fast];
}
//这样子就会到那个入口的位置 然后返回对应的值吧
return fast;
}
}