491. 非递减子序列
思路与重点
- 我的解法:使用unordered_set来对本层元素去重
class Solution {
private:
vector<vector<int>> ans;
vector<int> path;
void backtracking(vector<int>& nums, int startIdx, int pre){
if(path.size() >= 2){
ans.push_back(path);
}
unordered_set<int> used;
for(int i = startIdx; i < nums.size(); i++){
if(used.find(nums[i]) != used.end()) continue;
if(nums[i] >= pre){
path.push_back(nums[i]);
used.insert(nums[i]);
backtracking(nums, i + 1, nums[i]);
path.pop_back();
}
else continue;
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums, 0, -100);
return ans;
}
};
- 代码随想录解法:其实用数组来做哈希,效率就高了很多。注意题目中说了,数值范围[-100,100],所以完全可以用数组来做哈希。程序运行的时候对unordered_set频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且每次重新定义set,insert的时候其底层的符号表也要做相应的扩充,也是费事的。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex) {
if (path.size() > 1) {
result.push_back(path);
}
int used[201] = {
0};
for (int i = startIndex; i < nums.size(); i++) {
if ((!path.empty() && nums[i] < path.back())
|| used[nums[i] + 100] == 1) {
continue;
}
used[nums[i] + 100] = 1;
path.push_back(nums[i]);
backtracking(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums, 0);
return result;
}
};
46.全排列
思路与重点
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
void backtracking(vector<int