diff --git a/js/subsets/README.md b/js/subsets/README.md index c4a750b..2ca7713 100644 --- a/js/subsets/README.md +++ b/js/subsets/README.md @@ -9,8 +9,7 @@ Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,3], a solution is: - - +``` [ [3], [1], @@ -21,3 +20,5 @@ If nums = [1,2,3], a solution is: [1,2], [] ] + +``` diff --git a/js/subsetsIi/README.md b/js/subsetsIi/README.md new file mode 100644 index 0000000..15c488b --- /dev/null +++ b/js/subsetsIi/README.md @@ -0,0 +1,22 @@ +## Subsets II +link: + +Given a collection of integers that might contain duplicates, nums, return all possible subsets. + +Note: The solution set must not contain duplicate subsets. + + +For example, +If nums = [1,2,2], a solution is: + + +``` +[ + [2], + [1], + [1,2,2], + [2,2], + [1,2], + [] +] +``` diff --git a/js/subsetsIi/subsets-ii.js b/js/subsetsIi/subsets-ii.js new file mode 100644 index 0000000..356ff3d --- /dev/null +++ b/js/subsetsIi/subsets-ii.js @@ -0,0 +1,39 @@ +/** + * @param {number[]} nums + * @return {number[][]} + **/ +var subsetsWithDup = function(nums) { + return getSolutions(nums, []).concat([[]]); +}; + +function getSolutions(nums, list) { + if (nums.length === 0) { + return []; + } + + var resNext = getSolutions(nums.slice(1), list); + + var res = []; + var current = nums[0]; + if (list.indexOf(current) === -1) { + list.push(current); + res.push([current]); + } + + res = [].concat(resNext, res); + + // n and n - 1 + for (var i = 0; i < resNext.length; i++) { + var val = resNext[i]; + res.push([].concat(current, val)); + } + + return res; +} + +console.log(subsetsWithDup([1, 2, 2])) + +var eq = require('assert').deepEqual; +eq(subsetsWithDup([1, 2, 2]), [[2], [1], [1,2,2], [2,2], [1,2], []]); + +eq(subsetsWithDup([1, 1, 2, 2]), [[],[1],[1,1],[1,1,2],[1,1,2,2],[1,2],[1,2,2],[2],[2,2]]);