方法:递归
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void solve(vector<int>& nums, int idx) {
if (path.size() > 1) res.push_back(path);
unordered_set<int> vis;
for (int i = idx; i < nums.size(); ++i) {
if (!path.empty() && path.back() > nums[i] || vis.find(nums[i]) != vis.end()) continue;
path.push_back(nums[i]);
vis.insert(nums[i]);
solve(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
res.clear();
solve(nums, 0);
return res;
}
};
$时间复杂度O(*n),空间复杂度O(n)
方法:递归·
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void solve(vector<int>& nums, vector<bool>& vis) {
if (path.size() == nums.size()) {
res.push_back(path);
return ;
}
for (int i = 0; i < nums.size(); ++i) {
if (!vis[i]) {
vis[i] = true;
path.push_back(nums[i]);
solve(nums, vis);
path.pop_back();
vis[i] = false;
}
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
res.clear();
int n = nums.size();
vector<bool> vis(n, false);
solve(nums, vis);
return res;
}
};
$时间复杂度O(),空间复杂度O(n)
方法:递归
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void solve(vector<int>& nums, vector<bool>& vis) {
if (path.size() == nums.size()) {
res.push_back(path);
return ;
}
for (int i = 0; i < nums.size(); ++i) {
if (i && nums[i] == nums[i-1] && vis[i-1] == false) continue;
if (!vis[i]) {
path.push_back(nums[i]);
vis[i] = true;
solve(nums, vis);
path.pop_back();
vis[i] = false;
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
vector<bool> vis(n, false);
res.clear();
sort(nums.begin(), nums.end());
solve(nums, vis);
return res;
}
};
$时间复杂度O(),空间复杂度O(n)