天天看點

LeetCode 442.數組中重複的資料 - JavaScript

題目描述:給定一個整數數組 a,其中

1 ≤ a[i] ≤ n

(n 為數組長度), 其中有些元素出現兩次而其他元素出現一次。

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

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

題目分析

這裡的不使用任何額外空間,指的是不為哈希表開辟額外空間。最後要傳回的元素,還是要放在數組内的。

解法 1:原地哈希

因為不能使用額外空間存儲哈希表,是以隻能對數組本身做操作。題目提到元素的範圍是 1 到 n,并且元素隻可能出現 1 次或者 2 次。

是以這裡可以使用符号來标記元素是否出現過。下标為 i 的元素的符号,代表着值為 i + 1 的元素是否出現過,負号是出現過,正号是沒出現過。

代碼實作如下:

// ac位址:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/
// 原文位址:https://xxoo521.com/2020-02-14-find-all-duplicates-in-an-array/
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDuplicates = function(nums) {
    const res = [];
    for (const num of nums) {
        const absNum = Math.abs(num);
        if (nums[absNum - 1] < 0) {
            res.push(absNum);
        } else {
            nums[absNum - 1] = -1 * nums[absNum - 1];
        }
    }

    return res;
};           

複制

空間複雜度是 O(1),時間複雜度是 O(N)。