1. 程式人生 > 其它 >LeetCode No442. 陣列中重複的資料

LeetCode No442. 陣列中重複的資料

題目

給你一個長度為 n 的整數陣列 nums ,其中 nums 的所有整數都在範圍 [1, n] 內,且每個整數出現 一次 或 兩次 。請你找出所有出現 兩次 的整數,並以陣列形式返回。

你必須設計並實現一個時間複雜度為 O(n) 且僅使用常量額外空間的演算法解決此問題。

示例 1:

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

示例 2:

輸入:nums = [1,1,2]
輸出:[1]

示例 3:

輸入:nums = [1]
輸出:[]

提示:

n == nums.length
1 <= n <= 10^5
1 <= nums[i] <= n
nums 中的每個元素出現 一次 或 兩次

思路

模擬雜湊,對於相同值通過一樣的雜湊演算法計算出來的位置一定是一樣的,這樣就可以找出重複的數。

AC程式碼

點選檢視程式碼
class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int n = nums.length;
        for(int i=0; i<n; i++) {
            int num = Math.abs(nums[i]);
            if( nums[num-1]>0 ) {
                nums[num-1] = -nums[num-1];
            } else {
                res.add(num);
            }
        }
        return res;
    }
}