function permuteUnique(nums: number[]): number[][] {
    const results: number[][] = [];
    const numsCount = new Map();
    for (let n of nums) {
        numsCount.set(n, (numsCount.get(n) ?? 0) + 1);
    }

    function traverse(sequence: number[] = []) {
        if (sequence.length === nums.length) {
            results.push([...sequence]);
            return;
        }

        for (let [n, count] of numsCount) {
            if (count === 0) continue;

            numsCount.set(n, count - 1);
            sequence.push(n);
            traverse(sequence);
            sequence.pop();
            numsCount.set(n, count);
        }
    }
    traverse();

    return results;
}