寻找重复数

寻找重复数

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
说明:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n^2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。
思路:

法1:

我的思路是先排序,然后使用快慢指针,时间和空间复杂度都能够满足,但是改变了原数组。

public static int findDuplicate(int[] nums) {
        Arrays.sort(nums);
        int i=0,c=nums[0];
        for (int j=1;j<nums.length;j++){
            if (nums[i]!=nums[j])
                i++;
            else {
                c=nums[i];
                break;
            }
        }
        return c;
    }

法2:

在数组上迭代时存储每个元素,这样就可以在迭代时简单地检查每个元素。
为了实现线性时间复杂性,可以在迭代数组时把每个元素插入set集合seen中,并在每次迭代时检查集合seen中是否包含重复的那个数字。

 public static int findDuplicate(int[] nums) {
        Set<Integer> seen = new HashSet<Integer>();
        for (int num : nums){
            if (seen.contains(num)){
                return num;
            }
            seen.add(num);
        }
        return -1;
    }

发布了39 篇原创文章 · 获赞 31 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章