文章目录
- 1.全排列
- 2.子集
1.全排列
全排列
class Solution {vector<vector<int>> ret;vector<int> path;bool check[7];//标记nums数组某个下标是否已访问,剪枝使用
public:vector<vector<int>> permute(vector<int>& nums) {//递归+回溯+剪枝dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size() == path.size()) {ret.push_back(path);return;}for(int i=0;i<nums.size();i++){if(check[i]== false){path.push_back(nums[i]);check[i] = true;dfs(nums);//回溯--"恢复现场"path.pop_back();check[i] = false;}}}
};
2.子集
子集
class Solution {vector<vector<int>> ret;vector<int> path;
public:vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}// //法一:// void dfs(vector<int>& nums,int pos)// {// if(pos == nums.size())// {// ret.push_back(path);// return;// }// //选// path.push_back(nums[pos]);// dfs(nums,pos+1);// path.pop_back();// //不选// dfs(nums,pos+1);// }//法二:void dfs(vector<int>& nums,int pos){ret.push_back(path);for(int i=pos;i<nums.size();i++){path.push_back(nums[i]);dfs(nums,i+1);path.pop_back();}}
};