47. Permutations II
Permutations II
Given a collection of numbers, nums
, that might contain duplicates, return all possible unique permutations in any order.
Example 1:
Input: nums = [1,1,2] Output: [[1,1,2], [1,2,1], [2,1,1]]
Example 2:
Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Constraints:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
let permArr = [];
let usedChars = [];
const permuteUnique = (nums) => {
permArr = [];
usedChars = [];
let data = permute(nums);
return removeDuplicatesMultiArray(data);
};
const permute = (input) => {
let ch;
for (let i = 0; i < input.length; i++) {
ch = input.splice(i, 1)[0];
usedChars.push(ch);
if (input.length == 0) {
permArr.push(usedChars.slice());
}
permute(input);
input.splice(i, 0, ch);
usedChars.pop();
}
return permArr;
};
const removeDuplicatesMultiArray = (arr) => {
return arr.map(JSON.stringify).reverse().filter((item, index, arr) => {
return arr.indexOf(item, index + 1) === -1;
}).reverse().map(JSON.parse);
};
Approach) Backtrack
var permuteUnique = function(nums) {
nums.sort();
const res = [];
backTracking(res, [], new Set(), nums);
return res;
function backTracking(res, tempList, visited = new Set(), nums) {
if (tempList.length == nums.length) {
res.push([...tempList]);
return;
}
for (let i = 0; i < nums.length; i++) {
if (visited.has(i)) continue;
if (i > 0 && nums[i] == nums[i - 1] && !visited.has(i - 1)) continue;
tempList.push(nums[i]);
visited.add(i);
backTracking(res, tempList, visited, nums);
tempList.pop();
visited.delete(i);
}
}
};
Approach) HashTable (Hash Map)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function(nums) {
let resultMap = new Map();
let theMap = new Map();
backtrack(nums, resultMap, theMap);
return [...resultMap.values()];
};
function backtrack(nums, resultMap, map) {
if (map.size === nums.length) {
resultMap.set([...map.values()].join(""), [...map.values()]);
return;
}
for (let i = 0; i < nums.length; i++) {
let available = map.get(i);
if (available === undefined) {
map.set(i, nums[i]);
backtrack(nums, resultMap, map);
map.delete(i);
}
}
}
Approach) Recursion
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function(nums) {
const n = nums.length
let res = []
nums.sort((x, y) => x - y)
helper([], new Array(n).fill(false))
return res
function helper(temp, used) {
if (temp.length === n) {
res.push(temp.slice())
return;
}
for (let i = 0; i < n; i++) {
if (used[i] || used[i-1] && nums[i] == nums[i-1]) continue;
temp.push(nums[i])
used[i] = true;
helper(temp, used)
temp.pop()
used[i] = false;
}
}
};
Approach) DFS (Depth First Search)
var permuteUnique = function (nums) {
const freq = new Map();
for (let num of nums) {
if (!freq.has(num)) freq.set(num, 0);
freq.set(num, freq.get(num) + 1);
}
let perm = [];
let res = [];
function dfs() {
if (nums.length === perm.length) {
res.push([...perm]);
return;
}
for (let key of [...freq.keys()]) {
if (freq.get(key) > 0) {
perm.push(key);
freq.set(key, freq.get(key) - 1);
dfs();
perm.pop();
freq.set(key, freq.get(key) + 1);
}
}
}
dfs();
return res;
};
Conclusion
That’s all folks! In this post, we solved LeetCode problem 47. Permutations II
I hope you have enjoyed this post. Feel free to share your thoughts on this.
You can find the complete source code on my GitHub repository. If you like what you learn. feel free to fork 🔪 and star ⭐ it.
In this blog, I have tried to collect & present the most important points to consider when improving Data structure and logic, feel free to add, edit, comment, or ask. For more information please reach me here
Happy coding!
Comments
Post a Comment