Skip to content

Commit cc422e7

Browse files
author
kwu130
committed
feat(src): add 46-permute, 47-permuteUnique
1 parent d1b3350 commit cc422e7

2 files changed

Lines changed: 123 additions & 0 deletions

File tree

‎src/46-permute.cpp‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// Created by 1412 on 2025/10/27.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
class Solution {
10+
public:
11+
vector<vector<int>> permute(vector<int>& nums) {
12+
vector<vector<int>> res;
13+
dfs(nums, vector<bool>(nums.size(), false), {}, res);
14+
return res;
15+
}
16+
17+
private:
18+
void dfs(vector<int>& nums, vector<bool>&& used, vector<int>&& path, vector<vector<int>>& res) {
19+
if (path.size() == nums.size()) {
20+
res.emplace_back(path);
21+
return;
22+
}
23+
for (int i = 0; i < nums.size(); ++i) {
24+
if (used[i]) continue;
25+
used[i] = true;
26+
path.emplace_back(nums[i]);
27+
dfs(nums, std::move(used), std::move(path), res);
28+
path.pop_back();
29+
used[i] = false;
30+
}
31+
}
32+
};
33+
34+
void test() {
35+
Solution s;
36+
vector<int> nums = {1, 2, 3};
37+
vector<vector<int>> expected = {
38+
{1, 2, 3},
39+
{1, 3, 2},
40+
{2, 1, 3},
41+
{2, 3, 1},
42+
{3, 1, 2},
43+
{3, 2, 1}
44+
};
45+
assert(s.permute(nums) == expected);
46+
47+
nums = {0, 1};
48+
expected = {
49+
{0, 1},
50+
{1, 0}
51+
};
52+
assert(s.permute(nums) == expected);
53+
54+
nums = {1};
55+
expected = {{1}};
56+
assert(s.permute(nums) == expected);
57+
}
58+
59+
int main() {
60+
test();
61+
return 0;
62+
}

‎src/47-permuteUnique.cpp‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// Created by 1412 on 2025/10/27.
3+
//
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
class Solution {
10+
public:
11+
vector<vector<int>> permuteUnique(vector<int>& nums) {
12+
vector<vector<int>> res;
13+
ranges::sort(nums); // sort nums firstly
14+
dfs(nums, vector<bool>(nums.size(), false), {}, res);
15+
return res;
16+
}
17+
18+
private:
19+
void dfs(vector<int>& nums, vector<bool>&& used, vector<int>&& path, vector<vector<int>>& res) {
20+
if (path.size() == nums.size()) {
21+
res.emplace_back(path);
22+
return;
23+
}
24+
for (int i = 0; i < nums.size(); ++i) {
25+
if (used[i]) continue;
26+
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
27+
used[i] = true;
28+
path.emplace_back(nums[i]);
29+
dfs(nums, std::move(used), std::move(path), res);
30+
path.pop_back();
31+
used[i] = false;
32+
}
33+
}
34+
};
35+
36+
void test() {
37+
Solution s;
38+
vector<int> nums = {1, 1, 2};
39+
vector<vector<int>> expected = {
40+
{1, 1, 2},
41+
{1, 2, 1},
42+
{2, 1, 1}
43+
};
44+
assert(s.permuteUnique(nums) == expected);
45+
46+
nums = {1, 2, 3};
47+
expected = {
48+
{1, 2, 3},
49+
{1, 3, 2},
50+
{2, 1, 3},
51+
{2, 3, 1},
52+
{3, 1, 2},
53+
{3, 2, 1}
54+
};
55+
assert(s.permuteUnique(nums) == expected);
56+
}
57+
58+
int main() {
59+
test();
60+
return 0;
61+
}

0 commit comments

Comments
 (0)