写在前面:
本周算法课老师讲解了DFS,特此选一道可以用DFS解决的题目。
题意解读:
给定一个整数集,里面的整数互不相同,输出这个数组的所有子集。
解题思路:
如果将整数集的每个元素都看成一个点,点与点之间相互联通,那么所有子集既是找出点到点间所有不重复的路径。
每多一个元素,子集就是原来所有子集加上原来所有子集到这个元素的路径。如:
当集是空时,子集是[]。
当子集有1个元素[1]时,子集是[],[1]
当子集有2个元素[1,2]时,子集是[],[1],[2],[1,2]
当子集有3个元素[1,2,3]时,子集是[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]
……
那问题就简化成每次拿出一个元素,找出剩下元素的所有子集,迭代到集合是空时。
用DFS深度优先的思想,反过来做以上步骤,遍历二叉树,每一步的路径(子集)都保存。
我们需要一个vector来存储这些路径,定义private变量result来保存。
代码:
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<int> temp; sort(nums.begin(), nums.end()); DFS(0, nums, temp); return results; } void DFS(int pos, vector<int>& nums, vector<int> seq){ results.push_back(seq); for(; pos < nums.size(); pos++){ seq.push_back(nums[pos]); DFS(pos+1, nums, seq); seq.pop_back(); } } private: vector<vector<int>> results; }; 运行结果:
提交后,Accepted。