LeetCode78 子集 &《程序员面试金典》面试题 08.04. 幂集
题目
解题
解题一:位运算
var subsets = function(nums) {
const allsubsets = [];
const max = 1 << nums.length;
for (let i = 0; i < max; i++) {
const subset = convertIntToSet(nums, i);
allsubsets.push(subset);
}
return allsubsets;
};
var convertIntToSet = function(nums, x) {
let index = 0;
const subset = [];
while (x > 0) {
if ((x & 1) === 1) subset.push(nums[index]);
x >>>= 1;
index++;
}
return subset;
};
解题二:非递归版简单构造
var subsets = function(nums) {
const allSubsets = [[]];
for (const num of nums) {
const length = allSubsets.length;
for (let i = 0; i < length; ++i) {
const cloneSubset = allSubsets[i].slice();
cloneSubset.push(num);
allSubsets.push(cloneSubset);
}
}
return allSubsets;
};
解题三:递归版简单构造
var subsets = function(nums) {
const allSubsets = [[]];
return getSubsets(nums, 0, allSubsets);
};
var getSubsets = function(nums, index, allSubsets) {
if (nums.length === index) return allSubsets;
const moreSubsets = [];
for (const subset of allSubsets) {
const cloneSubset = subset.slice();
cloneSubset.push(nums[index]);
moreSubsets.push(cloneSubset);
}
allSubsets = allSubsets.concat(moreSubsets);
return getSubsets(nums, index + 1, allSubsets);
};
var subsets = function(nums) {
return getSubsets(nums, 0);
};
var getSubsets = function(nums, index) {
let allSubsets = [];
if (nums.length === index) {
allSubsets.push([]);
}
else {
allSubsets = getSubsets(nums, index + 1);
const item = nums[index], moreSubsets = [];
for (const subset of allSubsets) {
const cloneSubset = subset.slice();
cloneSubset.push(item);
moreSubsets.push(cloneSubset);
}
allSubsets = allSubsets.concat(moreSubsets);
}
return allSubsets;
};
解题四:回溯版简单构造
var subsets = function(nums) {
const allSubsets = [], subset = [];
backtrack(allSubsets, subset, 0, nums);
return allSubsets;
};
var backtrack = function(allSubsets, subset, index, nums) {
allSubsets.push(subset.slice());
for (let i = index; i < nums.length; i++) {
subset.push(nums[i]);
backtrack(allSubsets, subset, i + 1, nums);
subset.pop();
}
};
参考:回溯,位运算,等共4种方式解决(图文详解)