地址 https://leetcode-cn.com/problems/permutations/submissions/
给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
算法1
使用DFS 进行填充的尝试
使用了vis数组标注那些数字已经使用 那些没有使用
class Solution { public: vector<int> vis; vector<vector<int>> ans; vector<int> v; void dfs(vector<int>& nums, int idx) { if (idx > nums.size()) return; if (idx == nums.size()) { ans.push_back(v); return; } for (int i = 0; i < nums.size(); i++) { if (vis[i] == 0) { v[idx] = nums[i]; vis[i] = 1; dfs(nums, idx + 1); vis[i] = 0; v[idx] = -1; } } return; } vector<vector<int>> permute(vector<int>& nums) { int len = nums.size(); vis = vector<int>(len,0); v = vector<int>(len, -1); dfs(nums, 0); return ans; } };
算法2
直接每局索引 交换nums的两个索引 就得到新的组合
关键是如何取得交换的两个索引 保证不漏不重
代码流程 从索引0开始分别后索引1,2,3~~~n的数字交换 得到新的组合
由于还有不交换的情况 索引考虑了索引0和索引0的交换
class Solution { public: vector<vector<int>> ans; void dfs(vector<int>& nums, int idx) { if (idx >= nums.size()) return; if (idx == nums.size() - 1) { ans.push_back(nums); return; } for (int i = idx ; i < nums.size(); i++) { swap(nums[i], nums[idx]); dfs(nums, idx + 1); swap(nums[i], nums[idx]); } } void printVec(const vector<vector<int>>& ans) { for (auto& e : ans) { for (auto&ee : e) { cout << ee << " "; } cout << endl; } } vector<vector<int>> permute(vector<int>& nums) { dfs(nums, 0); //printVec(ans); return ans; } };