[LeetCode][JavaScript]Subsets

Subsets

Given a set of distinct integers, 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,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

https://leetcode.com/problems/subsets/

 

 


 

 

全排列。

首先是非递归的巧妙解法。

比如题目中的例子[1,2,3]:

一共有8种情况,如果用三位的二进制表示,1代表选,0代表不选,正好就是000到111。

代码中的padLeft方法把当前的数转化成长度等于nums.length的二进制字符串,位数不足以0补齐。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[][]}
 4  */
 5 var subsets = function(nums) {
 6     nums = nums.sort(sorting);
 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         res.push(tmp);
17     }
18     return res;
19     
20     function padLeft(num, len){
21         var res = "", i = len;
22         while(i--) res += '0';
23         var tmp = parseInt(num).toString(2);
24         res = res + tmp;
25         return res.substring(tmp.length, res.length);
26     }
27 
28     function sorting(a, b){
29         return a - b;
30     }
31 };

效率很高。

 

 

常规的递归解法。

比较难以描述,举栗子[1,2,3,4]

当递归到[1,2]的时候,下一轮的递归是[1,2,3]和[1,2,4]。

[1,2,3]又会递归到[1,2,3,4]。

当递归到[1,3]的时候,下一轮的递归是[1,3,4]。

以此类推。

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

 

 

 

 

 

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