leetcode78 - Subsets - medium
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
画个recursion tree,从空集开始,对于原始set里的每个数,无非是取或者不取
{ } // add 1?
/\
{1} { } // add 2?
/\ /\
{1,2} {1} {2} { } // add 3?
/\ /\ /\ /\
{1,2,3} {1,2} {1,3} {1} {2,3} {2} {3} { }
遍历每个数,每次分两路,加的话就先把它加进当前subset里再继续到下一层,不加的话,把它pop出来再继续下一层,有点recursive dfs的意思
idx等于原始set大小的时候,表示每个数都操作过了,也就是到了recursion tree的叶节点了,把subset push进返还结果里,subset有2n个
实现:
class Solution { private: void dfs(vector<int>& nums, vector<vector<int>>& res, vector<int>& subset, int idx){ if (idx == nums.size()) res.push_back(subset); else{ subset.push_back(nums[idx]); dfs(nums, res, subset, idx+1); subset.pop_back(); dfs(nums, res, subset, idx+1); } } public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> subset; dfs(nums, res, subset, 0); return res; } };

浙公网安备 33010602011771号