🧩Algo 回溯
46. 全排列
难度:🟡 Medium | 标签:回溯 | 状态:⬜ LeetCode 链接
思路
回溯:used[i] 标记是否已选。
路径长度等于 n 时收集结果。
代码
class Solution {
vector<vector<int>> res;
vector<int> path;
vector<bool> used;
void dfs(vector<int>& nums) {
if (path.size() == nums.size()) { res.push_back(path); return; }
for (int i = 0; i < (int)nums.size(); ++i) {
if (used[i]) continue;
used[i] = true;
path.push_back(nums[i]);
dfs(nums);
path.pop_back();
used[i] = false;
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
used.assign(nums.size(), false);
dfs(nums);
return res;
}
};
复杂度
- 时间 O(n · n!),空间 O(n)(不计输出)
易错 / 回顾
- 排列 =
used[];组合 =start索引 - 含重复元素的全排列(47):先排序 + 「同层去重」
if (i > 0 && nums[i] == nums[i-1] && !used[i-1]) continue;
Related · 回溯