您的位置:首页 > Web前端 > JavaScript

[LeetCode][JavaScript]Subsets

2015-08-15 20:48 645 查看

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补齐。

/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
nums = nums.sort(sorting);
var res = [];
for(var i = 0; i < Math.pow(2, nums.length); i++){
var str = padLeft(i, nums.length);
var tmp = [];
for(var j = 0; j < str.length; j++){
if(str[j] === '1'){
tmp.push(nums[j]);
}
}
res.push(tmp);
}
return res;

function padLeft(num, len){
var res = "", i = len;
while(i--) res += '0';
var tmp = parseInt(num).toString(2);
res = res + tmp;
return res.substring(tmp.length, res.length);
}

function sorting(a, b){
return a - b;
}
};


效率很高。



常规的递归解法。

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

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

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

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

以此类推。

/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
nums = nums.sort(sorting);
var res = [[]], arr = [];
for(var i = 0; i < nums.length; i++){
res.push([nums[i]]);
arr.push({val : [nums[i]], pos : i});
}
getSets(arr);
return res;

function getSets(arr){
var i, j, tmp, nextArr = [];
for(i = 0; i < arr.length; i++){
for(j = arr[i].pos + 1; j < nums.length; j++){
tmp = arr[i].val.slice(0);
tmp.push(nums[j]);
res.push(tmp);
nextArr.push({val : tmp, pos : j});
}
}
if(nextArr.length > 0){
getSets(nextArr);
}
}

function sorting(a, b){
return a - b;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: