1. 程式人生 > 實用技巧 >LeetCode一刷:回溯演算法-子集

LeetCode一刷:回溯演算法-子集

問題描述:

子集
給定一組不含重複元素的整數陣列nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。

示例:

輸入: nums = [1,2,3]
輸出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

作者:力扣 (LeetCode)
連結:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv67o6/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

分析:

畫個草圖:

解法:

var backtrack = function
(list, tmpList, nums, start) { const len = nums.length; if(start === len) { return; } for(let i=start; i<len; i++) { tmpList.push(nums[i]); list.push([...tmpList]); for(let j=i+1;j<len;j++) { tmpList.push(nums[j]); list.push([...tmpList]); backtrack(list, tmpList, nums, j
+1); tmpList.pop(); } tmpList.pop(); } }; /** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { var len = nums.length; if(len === 0) return [[]]; var list = [[]]; backtrack(list, [], nums, 0); return list; };

改進版:

var
backtrack = function(list, tmpList, nums) { const len = nums.length; if(0 === len) { return; } for(let i=0; i<len; i++) { tmpList.push(nums[i]); list.push([...tmpList]); backtrack(list, tmpList, nums.slice(i+1)); tmpList.pop(); } }; /** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { var len = nums.length; if(len === 0) return [[]]; var list = [[]]; backtrack(list, [], nums); return list; };