1、LeetCode491递增子序列
题目链接:491、递增子序列
本题不能排序,{4,7,6,7}的递增子序列没有{4,6,7,7},排序后会有{4,6,7,7}.
{4,7,3,7}的递增子序列没有{3,4},所以startIndex从i+1开始。
首先,当path数组中元素个数大于2时,才将path加入到result中。
每次循环时,判断要添加的元素nums[i]如果小于path.back(),continue;
或者unordered_set<int> uset里如果有该元素存在,说明在同一树层,也要continue。
如果是同一树枝的话,每次递归uset都会清空。
如果符合添加的条件,uset.insert(nums[i]);path.push_back(nums[i]);
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtraking(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.back()) || uset.find(nums[i]) != uset.end())
{
continue;
}
uset.insert(nums[i]);
path.push_back(nums[i]);
backtraking(nums, i + 1);
path.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
result.clear();
path.clear();
backtraking(nums, 0);
return result;
}
};
2、LeetCode46 全排列
题目链接:46、全排列
if (used[i] = true) 说明该元素使用过,在回溯时,令used[i] = false;
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, vector<bool>& used)
{
if (path.size() == nums.size())
{
result.push_back(path);
}
for (int i = 0; i < nums.size(); i++)
{
if (used[i] == true)
{
continue;
}
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
backtracking(nums,used);
return result;
}
};
3、LeetCode47全排列II
题目链接:47、全排列II
本题不能重复,要考虑去重。
如果 (i > 0 && nuns[i] == nums[i-1] && used[i-1] == false),说明当前元素重复,而且是在树层上重复,因为已经发生了回溯,used[i-1] == false; continue;
如果 used[i] == true,说明当前元素已经取过了,也要continue。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, vector<bool>& used)
{
if (path.size() == nums.size())
{
result.push_back(path);
}
for (int i = 0; i < nums.size(); i++)
{
if ( (i > 0 && nums[i] == nums[i-1] && used[i-1] == false) || used[i] == true)
{
continue;
}
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
result.clear();
path.clear();
sort(nums.begin(), nums.end());
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return result;
}
};