您的位置:首页 > 其它

算法课第三周作业 | Subsets

2017-03-12 17:57 274 查看
写在前面:

本周算法课老师讲解了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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 算法 dfs