每层选择未使用元素,swap 写法不重不漏。
OJ: leetcodecn
题目 ID: permutations
难度:普及+/提高
标签:回溯DFS递归cpppython
日期: 2026-07-29 13:10
题意
返回数组所有全排列。
思路
DFS 回溯,swap 写法将当前数与后面每个数交换,递归后恢复。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<vector<int>> permute(vector<int> &nums) {
vector<vector<int>> ans;
function<void(int)> dfs = [&](int dep) {
if (dep == (int)nums.size()) {
ans.push_back(nums);
return;
}
for (int i = dep; i < (int)nums.size(); i++) {
swap(nums[dep], nums[i]);
dfs(dep + 1);
swap(nums[dep], nums[i]);
}
};
dfs(0);
return ans;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int &x : a)
cin >> x;
for (auto &v : Solution().permute(a)) {
for (int x : v)
cout << x << ' ';
cout << '\n';
}
return 0;
}python
#!/usr/bin/env python3
from typing import List
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
ans = []
def dfs(dep):
if dep == len(nums):
ans.append(nums[:])
return
for i in range(dep, len(nums)):
nums[dep], nums[i] = nums[i], nums[dep]
dfs(dep + 1)
nums[dep], nums[i] = nums[i], nums[dep]
dfs(0)
return ans
def main():
n = int(input())
a = list(map(int, input().split()))
for v in Solution().permute(a):
print(*v)
if __name__ == "__main__":
main()复杂度
时间 O(n·n!),空间 O(n)。
总结
swap 写法省去 visited 数组,是排列生成的标准实现。