var subsets = function(nums) { const result = []; const n = nums.length; // 遍历所有可能的二进制组合 for (let i = 0; i < (1 << n); i++) { const subset = []; // 检查每一位 for (let j = 0; j < n; j++) { if (i & (1 << j)) { subset.push(nums[j]); } } result.push(subset); } return result; };
方法三:递归法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var subsets = function(nums) { if (nums.length === 0) { return [[]]; } const first = nums[0]; const rest = nums.slice(1); const subsetsWithoutFirst = subsets(rest); const result = [...subsetsWithoutFirst]; for (const subset of subsetsWithoutFirst) { result.push([first, ...subset]); } return result; };
方法四:迭代法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var subsets = function(nums) { const result = [[]]; for (const num of nums) { const newSubsets = []; for (const subset of result) { newSubsets.push([...subset, num]); } result.push(...newSubsets); } return result; };