491.递增子序列
给你一个整数数组 nums
,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
class Solution {
public:
vector<vector<int>> result;
vector<int> v;
void backtracking(vector<int> nums,int start)
{
if(v.size()>1) result.push_back(v);
if(start>=nums.size()) return;
unordered_set<int> used;
for(int i = start;i<nums.size();i++)
{
if(!v.empty()&&nums[i]<v.back()) continue;
if(used.find(nums[i])!=used.end()) continue;
v.push_back(nums[i]);
used.insert(nums[i]);
backtracking(nums,i+1);
v.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
- 这里的去重用了哈希表而非之前的方法,因为原数组的顺序不能改变,之前的两种去重办法需要先排序改变数组顺序。
46.全排列
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
class Solution {
public:
vector<vector<int>> result;
vector<int> v;
void backtracking(vector<int> nums,vector<bool>& used)
{
if(v.size() == nums.size())
{
result.push_back(v);
return;
}
for(int i = 0;i<nums.size();i++)
{
if(used[i] == true) continue;
v.push_back(nums[i]);
used[i] = true;
backtracking(nums,used);
used[i] = false;
v.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
int l = nums.size();
vector<bool> used(l,false);
backtracking(nums,used);
return result;
}
};
- 有点绕,排列与组合的区别是排列有顺序,所以可以先选取后边的数后选前边的数,故没有了回溯中的start参数。
47.全排列 II
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
class Solution {
public:
vector<vector<int>> result;
vector<int> v;
void backtracking(vector<int> nums,vector<bool>& used)
{
if(v.size() == nums.size())
{
result.push_back(v);
return;
}
for(int i = 0;i<nums.size();i++)
{
if(used[i] == true) continue;
if(i>0&&used[i-1] == false&&nums[i] == nums[i-1]) continue;
v.push_back(nums[i]);
used[i] = true;
backtracking(nums,used);
used[i] = false;
v.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
int l = nums.size();
vector<bool> used(l,false);;
backtracking(nums,used);
return result;
}
};
- 比46多了一步去重。