leetcode刷题 Day10

题目:
leetcode刷题 Day10
思路:利用Set的无重复值特性,找出重复值即可
代码:

class Solution {
    public int findDuplicate(int[] nums) {
        int checkNum=0;
        Set set=new HashSet();
        for(int i=0;i<nums.length;i++){
            if(!set.add(nums[i])){
                checkNum=nums[i];
            }
        }
        return checkNum;
        
    }
}

运行结果:
leetcode刷题 Day10

PS:此题要求空间复杂度为O(1),代表不能开辟新的hashset或者新的数组进行解题,数组只读,所以也不能对数组进行排序。所以需要换个方法,采用双指针的办法,定义快指针(fast)和慢指针(slow),快指针每次走两步(fast=nums[nums[fast]),慢指针每次走一步(slow=nums[slow]),当两个指针相等时,说明有循环,将fast变为与slow步子一致,循环当两指针相等时,就是循环入口,返回该入口即可。

class Solution {
    public int findDuplicate(int[] nums) {
        int fast=0;
        int slow=0;
        if(nums.length>1){
            while(true){
                fast=nums[nums[fast]];
                slow=nums[slow];
                if(slow==fast){
                    fast=0;
                    while(nums[fast]!=nums[slow]){
                        fast=nums[fast];
                        slow=nums[slow];
                    }
                    return nums[fast];
                }
            } 
        }
        return -1;
    }
}

运行结果:
leetcode刷题 Day10