法1
想法:
- 结果集 = 当前元素 + 当前元素与之后剩余元素的子集的组合 + []
- 陷阱:“当前元素与之后剩余元素的子集的组合”:当前元素应该与之后剩余元素的真子集组合,否则会出现重复组合(和空子集组合时)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
var i = 0, j = 0, temp = [], tmp = [], output = [];
for(i = 0; i < nums.length; i++) {
temp[0] = nums[i];
output.push(temp.concat([]));
tmp = realSubsets(nums.slice(i + 1));
for(j = 0; j < tmp.length; j++) {
output.push(temp.concat(tmp[j]));
}
}
output.push([]);
return output;
};
function realSubsets(nums) {
var i = 0, j = 0, temp = [], tmp = [], output = [];
for(i = 0; i < nums.length; i++) {
temp[0] = nums[i];
output.push(temp.concat([]));
tmp = realSubsets(nums.slice(i + 1));
for(j = 0; j < tmp.length; j++) {
output.push(temp.concat(tmp[j]));
}
}
return output;
}
法2
看了答案
想法:
- 遇到一个元素,将它加入结果集
- 遇到第二个元素,将它加入结果集(预先在结果集中加入[],那么该元素与空集衔接就是它本身);并将它与结果集合中其他子集衔接组成新的子集。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
var i = 0, j = 0, length = 0, temp = [], output = [];
output.push([]); // output中,空集也是子集之一
for(i = 0; i < nums.length; i++) {
temp[0] = nums[i];
length = output.length; // 将temp与output中当前子集衔接,并加入output
for(j = 0; j < length; j++) {
output.push(output[j].concat(temp));
}
}
return output;
};
法3:回溯
看了答案
想法:
- 以子集的长度(包含元素的个数)为结束条件
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
var k = 0, temp = [], output = [];
for(k = 0; k <= nums.length; k++) { // 子集长度由0到nums.length
backtrack(nums, temp, k, output);
}
return output;
};
function backtrack(nums, temp, k, output) {
if(temp.length == k) {
output.push(temp.concat([]));
}
var i = 0;
for(i = 0; i < nums.length; i++) {
temp.push(nums[i]);
backtrack(nums.slice(i + 1), temp, k, output);
temp.pop();
}
}
法4:二进制数/01串
看了答案
想法:
- 用01串表示nums中对应位置数字是否存在:0表示不存在,1表示存在。若存在则将其加入temp(nums的子集之一),最后将temp加入output
- 一个01串表示一种状态,即一个子集
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
var i = 0, j = 0, temp = [], output = [], state = "";
for(i = Math.pow(2, nums.length); i < Math.pow(2, nums.length + 1); i++) {
state = i.toString(2).slice(1);
for(j = 0; j < state.length; j++) {
if(state[j] == '1') {
temp.push(nums[j]);
}
}
output.push(temp.concat([]));
temp = [];
}
return output;
};