my-leetcode-logs-20230828

Last updated on 2023年9月4日 下午

(复习)78. 子集(C++回溯法实现)

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
class Solution {
public:

vector<int> path;
vector<vector<int>> result;

void backtracing(vector<int>& nums, int startIndex){
result.push_back(path);
if(startIndex > nums.size()){
return;
}

for(int i = startIndex;i < nums.size();i++){
path.push_back(nums[i]);
backtracing(nums, i + 1);
path.pop_back();
}

}


vector<vector<int>> subsets(vector<int>& nums) {
result.clear();
path.clear();
backtracing(nums, 0);
return result;
}
};

90. 子集 II(C++回溯实现)

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
class Solution {
public:
vector<int> path;
vector<vector<int>> result;

void backtracing(vector<int>& nums, int startIndex, vector<bool> used){
result.push_back(path);

if(startIndex >= nums.size()){
return;
}

for(int i = startIndex;i < nums.size();i++){
if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){
continue;
}

path.push_back(nums[i]);
used[i] = true;
backtracing(nums, i + 1, used);
used[i] = false;
path.pop_back();
}
}

vector<vector<int>> subsetsWithDup(vector<int>& nums) {
path.clear();
result.clear();
vector<bool> used(nums.size(), false);
sort(nums.begin(), nums.end());
backtracing(nums, 0, used);
return result;
}
};

491. 递增子序列(C++回溯法实现递增子序列)

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
class Solution {
public:
vector<int> path;
vector<vector<int>> result;

void backtracing(vector<int>& nums, int startIndex){
if(path.size() > 1){//题目中要求大于2的序列
result.push_back(path);
// return;不能加return是因为,需要取树上的所有结点
}

//定义本层去重需要使用的unordered_set
unordered_set<int> uset;
for(int i = startIndex; i < nums.size(); i ++){
if((!path.empty() && nums[i] < path[path.size() - 1]) || uset.find(nums[i]) != uset.end()){
continue;
}

path.push_back(nums[i]);
uset.insert(nums[i]);
backtracing(nums, i + 1);
path.pop_back();
}
}


vector<vector<int>> findSubsequences(vector<int>& nums) {
path.clear();
result.clear();
backtracing(nums, 0);
return result;
}
};

491. 递增子序列(C++回溯法实现递增子序列,使用int数组代替unordered_set)

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
class Solution {
public:
vector<int> path;
vector<vector<int>> result;

void backtracing(vector<int>& nums, int startIndex){
if(path.size() > 1){//题目中要求大于2的序列
result.push_back(path);
// return;不能加return是因为,需要取树上的所有结点
}

//定义本层去重需要使用的unordered_set
//unordered_set<int> uset;
//使用int类型数组代替unordered_set
int unums[201] = {0};
for(int i = startIndex; i < nums.size(); i ++){
if((!path.empty() && nums[i] < path[path.size() - 1]) || unums[nums[i] + 100] == 1){
continue;
}

path.push_back(nums[i]);
//uset.insert(nums[i]);
unums[nums[i] + 100] = 1;
backtracing(nums, i + 1);
path.pop_back();
}
}

vector<vector<int>> findSubsequences(vector<int>& nums) {
path.clear();
result.clear();
backtracing(nums, 0);
return result;
}
};

46. 全排列(C++回溯法实现,使用used数组标记是否使用过)

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
class Solution {
public:
vector<int> path;
vector<vector<int>> result;

void backtracing(vector<int>& nums, vector<bool>& used){
if(path.size() == nums.size()){//因为是全排列,所以当path的长度等于nums的长度时,得到结果
result.push_back(path);
return;
}

for(int i = 0;i < nums.size();i++){
if(used[i] == true){
continue;//表示当前nums[i]元素已经使用过
}
path.push_back(nums[i]);
used[i] = true;
backtracing(nums, used);
used[i] = false;
path.pop_back();
}
}

vector<vector<int>> permute(vector<int>& nums) {
path.clear();
result.clear();
vector<bool> used(nums.size(), false);
backtracing(nums, used);
return result;
}
};

my-leetcode-logs-20230828
https://thewangyang.github.io/2023/08/28/leetcode-notes-20230828/
Author
wyy
Posted on
2023年8月28日
Updated on
2023年9月4日
Licensed under