一道很好的题,之前去重时使用Used数组,比较i和i-1索引上的值,一个前提就是对数组进行了排序,而现在并不能排序,所以比较当前索引和前一个索引没有意义,反而只需要记录当前递归层有没有用过就好了
class Solution {
public:
vector<vector<int>> ans;
vector<int> arr;
void dfs(vector<int> nums, int m, vector<bool> used)
{
if (arr.size()>1) ans.push_back(arr);
if (m==nums.size())
{
return;
}
unordered_set<int> uset;
for (int i=m; i<nums.size(); i++)
{
if (uset.find(nums[i])!=uset.end()) continue;
if (arr.size()==0 || (arr.size()>0 && nums[i]>=arr[arr.size()-1]))
{
arr.push_back(nums[i]);
uset.insert(nums[i]);
dfs(nums, i+1, used);
arr.pop_back();
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums)
{
vector<bool> used(nums.size(), false);
dfs(nums, 0, used);
return ans;
}
};
class Solution {
public:
vector<vector<int>> ans;
vector<int> arr;
unordered_set<int> used;
void dfs(vector<int> nums)
{
if (used.size()==nums.size())
{
ans.push_back(arr);
return;
}
for (int i=0; i<nums.size(); i++)
{
if (used.find(nums[i])!=used.end()) continue;
arr.push_back(nums[i]);
used.insert(nums[i]);
dfs(nums);
used.erase(nums[i]);
arr.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums)
{
dfs(nums);
return ans;
}
};
class Solution {
public:
vector<vector<int>> ans;
vector<int> arr;
void dfs(vector<int> nums, vector<bool> used, int m)
{
if (m==nums.size())
{
ans.push_back(arr);
return;
}
unordered_set<int> uset;
for (int i=0; i<nums.size(); i++)
{
if (used[i]==true) continue;
if (uset.find(nums[i])!=uset.end()) continue;
arr.push_back(nums[i]);
used[i] = true;
uset.insert(nums[i]);
dfs(nums, used, m+1);
used[i] = false;
arr.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums)
{
vector<bool> used(nums.size(), false);
dfs(nums, used, 0);
return ans;
}
};