题:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
方法一:迭代法
核心逻辑:动态扩展子集, 小规模数据(n ≤ 20)推荐
const subsets = (nums) => {
const result = [[]];
for (const num of nums) {
const n = result.length;
for (let i = 0; i < n; i++) {
result.push([...result[i], num]);
}
}
return result;
};
方法二:回溯法(DFS+剪枝)
核心逻辑:通过深度优先搜索遍历所有决策路径
const subsets = (nums) => {
const result = [];
const backtrack = (start, path) => {
result.push([...path]); // 记录当前路径
for (let i = start; i < nums.length; i++) {
path.push(nums[i]); // 选择当前元素
backtrack(i + 1, path); // 递归下一层
path.pop(); // 撤销选择(回溯)
}
};
backtrack(0, []);
return result;
};
方法三:递归分治法
核心逻辑:基于数学归纳法递推生成子集
const subsets = (nums) => {
if (nums.length === 0) return [[]];
const last = nums.pop();
const prevSubsets = subsets(nums); // 递归获取前n-1元素的子集
const newSubsets = prevSubsets.map(sub => [...sub, last]);
return [...prevSubsets, ...newSubsets]; // 合并新旧子集
};
时间复杂度均为O(n*2^n)
场景选择建议
竞速场景:优先选择迭代法(代码最简)
复杂变体:使用回溯法(方便添加剪枝条件,如子集大小限制)
理论研究:递归法(便于数学证明)