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){ result.push_back(path); }
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){ result.push_back(path); }
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]); 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()){ result.push_back(path); return; }
for(int i = 0;i < nums.size();i++){ if(used[i] == true){ continue; } 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/