算法课第三周作业 | Subsets

    xiaoxiao2021-03-25  57

    写在前面:

    本周算法课老师讲解了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。

    转载请注明原文地址: https://ju.6miu.com/read-35803.html

    最新回复(0)