码迷,mamicode.com
首页 > 编程语言 > 详细

[LeetCode][JavaScript]Subsets

时间:2015-08-15 21:18:18      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

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],
  []
]

 

 


 

 

全排列。

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

比如题目中的例子[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         if(a > b){
30             return 1;
31         }else if(a < b){
32             return -1;
33         }else{
34             return 0;
35         }
36     }
37 };

效率很高。

技术分享

 

 

常规的递归解法。

比较难以描述,举栗子[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         if(a > b){
32             return 1;
33         }else if(a < b){
34             return -1;
35         }else{
36             return 0;
37         }
38     }
39 }

 

 

 

 

 

 

[LeetCode][JavaScript]Subsets

标签:

原文地址:http://www.cnblogs.com/Liok3187/p/4733079.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!