題:給你一個整數數組 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)
場景選擇建議
競速場景:優先選擇迭代法(代碼最簡)
復雜變體:使用回溯法(方便添加剪枝條件,如子集大小限制)
理論研究:遞歸法(便于數學證明)