赞
踩
思路
思路:求出数组中元素的所有排列顺序,并用数组输出。
解法一: 暴力枚举
解法二: 根据决策树 进行递归
path.size() == nums.size()
),将path加入到ret中,并向上返回。代码
class Solution { public: vector<vector<int>> ret; // 用于存储最终结果 bool used[7]; // 用于记录某个下标的元素是否在序列中 vector<int> path; // 用于记录某个下标的元素是否已经加入到序列中 vector<vector<int>> permute(vector<int>& nums) { dfs(nums); return ret; } void dfs(vector<int>& nums) { if(path.size() == nums.size()) { ret.push_back(path); return; } // 遍历数组,对每一位都进行dfs && 排列 for(int i = 0; i < nums.size(); ++i) { if(used[i] == false) // 如果该位置未加入到当前序列中 { path.push_back(nums[i]); used[i] = true; dfs(nums); // dfs向上返回回来 -> 回溯 path.pop_back(); used[i] = false; } } } };
解法一
解法: 根据 选与不选 画决策树
i == nums.size()
)向上返回即可。void dfs(vector<int>& nums, int i)
代码
class Solution { public: vector<vector<int>> ret; vector<int> path; vector<vector<int>> subsets(vector<int>& nums) { int i = 0; dfs(nums, i); return ret; } void dfs(vector<int>& nums, int i) { if(i == nums.size()) { ret.push_back(path); return; } // 不选当前元素 dfs(nums, i + 1); // 选当前元素 path.push_back(nums[i]); dfs(nums, i + 1); path.pop_back(); } };
解法二
void dfs(vector<int>& nums, int pos)
代码
class Solution { public: vector<vector<int>> ret; vector<int> path; vector<vector<int>> subsets(vector<int>& nums) { int pos = 0; dfs(nums, pos); return ret; } 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(); // 回溯 - 恢复现场 } } };
有待更新… …
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。