1. 程式人生 > >LeetCode442. 陣列中重複的資料

LeetCode442. 陣列中重複的資料

給定一個整數陣列 a,其中1 ≤ a[i] ≤ n (n為陣列長度), 其中有些元素出現兩次而其他元素出現一次

找到所有出現兩次的元素。

你可以不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?

示例:

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[2,3]

思路:使用額外的同nums陣列空間大小相同的陣列為nums陣列中的元素構建雜湊表。最後記錄出現次數大於1的元素。

class Solution {
    public List<Integer> findDuplicates(int[] nums) {
         List<Integer> res=new LinkedList<Integer>();
        int a[]=new int[nums.length];
        for(int i=0;i<nums.length;i++){
            a[nums[i]-1]++;
        }
        for(int i=0;i<nums.length;i++){
            if(a[i]>1){
                res.add(i+1);
            }
        }
        return res;
    }
}

解法二:不使用額外的空間(參考LeetCode)

class Solution {
    public static List<Integer> findDuplicates(int[] nums) {
        int n = nums.length;
        for(int i = 0; i < n; i++) {
            while(nums[i] != i + 1) {
                if(nums[nums[i] - 1] == nums[i]) {
                    break;
                }
                int tmp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = tmp;
            }
        }
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < n; i++) {
            if(nums[i] != i + 1) {
                list.add(nums[i]);
            }
        }
        return list;
    }
}