【代码随想录day 24】 力扣 78.集合
视频讲解:https://www.bilibili.com/video/BV1U84y1q7Ci/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html
力扣题目:https://leetcode.cn/problems/subsets/
这道题和往常的题目不一样的是,往常的回溯算法要求的是存入叶子节点,这道题要求返回所有可能的子集,那就需要把每一步经过的节点都要返回结果;并且还不能有重复的,下面是需要注意的几点:
- 想要去重,就是再下一层遍历时向后选择元素,之前选择过的不会再选择,这就可以有效去重
- 对于存入每个叶子节点,我们将result的push_back放在回溯算法执行的第一句,即只要执行回溯算法,就将path存入result中,不能放在判断终止条件之后,这样会漏掉最底层的叶子节点的情况。
class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>&nums, int startIndex){//每遍历一个节点就存入resultresult.push_back(path);//判断终止条件if(startIndex >= nums.size()){return;}//单层搜索for(int i = startIndex; i < nums.size(); i++){//存入节点path.push_back(nums[i]);//下一层backtracking(nums, i+1);//回溯path.pop_back();}//执行结束return;}
public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};