时间轴

2025-11-29

init


题目:

全排列回溯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <vector>
#include <unordered_set>
using std::vector;
using std::unordered_set;

class Solution {
private:
void backtrace(vector<vector<int> > &res, vector<int> &track, unordered_set<int> &tset, vector<int> &nums)
{
if (track.size() == nums.size()) {
res.push_back(track);
}

for (int num : nums) {
if (!tset.count(num)) {
track.push_back(num);
tset.insert(num);
backtrace(res, track, tset, nums);
track.pop_back();
tset.erase(num);
}
}
}

public:
vector<vector<int> > permute(vector<int> &nums)
{
vector<vector<int> > res;
vector<int> track;
unordered_set<int> tset;
backtrace(res, track, tset, nums);
return res;
}
};

另一种写法,使用swap把值交换到当前位置,恢复就再交换一次。这种速度最快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <vector>
using std::vector;

class Solution {
private:
void backtrace(vector<vector<int> > &res, vector<int> &nums, int pos)
{
int n = nums.size();
if (pos == n) {
res.push_back(nums);
return;
}

for (int i = pos; i < n; i++) {
std::swap(nums[i], nums[pos]);
backtrace(res, nums, pos + 1);
std::swap(nums[i], nums[pos]);
}
}

public:
vector<vector<int> > permute(vector<int> &nums)
{
vector<vector<int> > res;

backtrace(res, nums, 0);
return res;
}
};