[LeetCode][JavaScript]Subsets II

Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • 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],
  []
]

https://leetcode.com/problemset/algorithms/

 

 


 

 

上一题相同的思路,加上去重就可以了。

http://www.cnblogs.com/Liok3187/p/4733079.html

 

非递归:

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[][]}
 4  */
 5 var subsetsWithDup = function(nums) {
 6     nums = nums.sort(sorting);
 7     var res = [[]], arr = [], visited = new Set();
 8     for(var i = 0; i < nums.length; i++){
 9         if(!visited.has(nums[i])){
10             res.push([nums[i]]);
11             visited.add(nums[i]);
12         }
13         arr.push({val : [nums[i]], pos : i});
14     }
15     getSets(arr);
16     return res;
17 
18     function getSets(arr){
19         var i, j, tmp, nextArr = [];
20         for(i = 0; i < arr.length; i++){
21             for(j = arr[i].pos + 1; j < nums.length; j++){
22                 tmp = arr[i].val.slice(0);
23                 tmp.push(nums[j]);
24                 if(!visited.has(tmp.join('#'))){
25                     res.push(tmp);
26                     visited.add(tmp.join('#'));
27                 }
28                 nextArr.push({val : tmp, pos : j});
29             }
30         }
31         if(nextArr.length > 0){
32             getSets(nextArr);
33         }
34     }
35 
36     function sorting(a, b){
37         return a - b;
38     }
39 };

 

递归:

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[][]}
 4  */
 5 var subsetsWithDup = function(nums) {
 6     nums = nums.sort(sorting), visited = new Set();
 7     var res = [];
 8     for(var i = 0; i < Math.pow(2, nums.length); i++){
 9         var str = padLeft(i, nums.length);
10         var tmp = [];
11         for(var j = 0; j < str.length; j++){
12             if(str[j] === '1'){
13                 tmp.push(nums[j]);
14             }
15         }
16         if(!visited.has(tmp.join('#'))){
17             res.push(tmp);
18             visited.add(tmp.join('#'));
19         }
20     }
21     return res;
22     
23     function padLeft(num, len){
24         var res = "", i = len;
25         while(i--) res += '0';
26         var tmp = parseInt(num).toString(2);
27         res = res + tmp;
28         return res.substring(tmp.length, res.length);
29     }
30 
31     function sorting(a, b){
32         return a -b;
33     }
34 };

 

posted @ 2015-08-15 20:51  `Liok  阅读(349)  评论(0编辑  收藏  举报