方法:回溯
class Solution {
#define bas 100
vector<vector<int>> res;
vector<int> path;
private:
void dfs(vector<int>& nums, int idx) {
if (path.size() > 1) res.emplace_back(path);
bool vis[201] = {false};
for (int i = idx; i < nums.size(); ++i) {
if ((!path.empty() && nums[i] < path.back()) || vis[nums[i] + bas] == true) continue;
vis[nums[i] + bas] = true;
path.emplace_back(nums[i]);
dfs(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
res.clear();
path.clear();
dfs(nums, 0);
return res;
}
};
$时间复杂度O(n),空间复杂度O(n)
方法:回溯
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void dfs(vector<int>& nums, vector<bool>& vis) {
if (path.size() == nums.size()) res.emplace_back(path);
for (int i = 0; i < nums.size(); ++i) {
if (!vis[i]) {
vis[i] = true;
path.emplace_back(nums[i]);
dfs(nums, vis);
path.pop_back();
vis[i] = false;
}
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
res.clear();
path.clear();
vector<bool> vis(nums.size(), false);
dfs(nums, vis);
return res;
}
};
$时间复杂度O(nn!),空间复杂度O(n)
方法:回溯
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void dfs(vector<int>& nums, vector<bool>& vis) {
if (path.size() == nums.size()) {
res.emplace_back(path);
return ;
}
for (int i = 0; i < nums.size(); ++i) {
if (i > 0 && nums[i] == nums[i-1] && vis[i-1] == false) continue;
if (!vis[i]) {
path.emplace_back(nums[i]);
vis[i] = true;
dfs(nums, vis);
path.pop_back();
vis[i] = false;
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
res.clear();
path.clear();
vector<bool> vis(nums.size(), false);
sort(nums.begin(), nums.end());
dfs(nums, vis);
return res;
}
};
$时间复杂度O(nn!),空间复杂度O(n)