【LeetCode】287. 寻找重复数

在这里插入图片描述

直观的思路,创建一个HashSet,遍历数组,直到找到重复的那个数字。(违反了原题中额外空间的要求)

另寻他法。

在这里插入图片描述

class Solution {
    public int findDuplicate(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            if(set.contains(num)){
                return num;
            }else {
                set.add(num);
            }
        }
        return 0;
    }
}
另一个思路是,这n+1个数,序号为0,1,2…n,数的范围在[1, n],至少有一个数重复。我遍历数组,遍历到某个数,我们获取它的绝对值x,我去看看序号为x的位置,如果x为负值,我们就找到了重复的数为x,如果不为负值,说明我们是第一次遍历到数x,我们将序号为x的位置的数置为相反数。

在这里插入图片描述

class Solution {
    public int findDuplicate(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            int num = Math.abs(nums[i]);// 这个位置的数字是num
            if (nums[num] < 0) {
                return num;
            } else {// 说明num这个数是第一次出现。
                nums[num] = -nums[num];
            }
        }
        return -1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章