14.491.递增子序列
·
思路:
当成求子集问题去处理。
用到了树层去重操作。
储备:
代码随想录 中关于哈希的知识。看看。因为跳过了哈希。但看这篇足够解这道题
问题重点:
最后:
用数组去重:
class Solution {//用数组去重
public:
vector<vector<int>> res;
vector<int> path;
void trace(vector<int>& nums, int st) {
if (path.size()>1) res.push_back(path);//遍历所有节点。不返回。
// unordered_set<int> uset;
int used[201]={0};//每层新建一个,用于本层去重
for (int i=st;i<nums.size();i++) {
if ((!path.empty() && nums[i]<path.back()) //排除不递增的情况
|| used[nums[i]+100])//nums[]范围为[-100,100],加了之后变成[0,200]一共201个
continue;
// uset.insert(nums[i]);
used[nums[i]+100]++;
path.push_back(nums[i]);
trace(nums,i+1);
path.pop_back();
}
return ;
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
trace(nums,0);
return res;
}
};
用unordered_set去重:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void trace(vector<int>& nums, int st) {
if (path.size()>1) res.push_back(path);//遍历所有节点。不返回。
unordered_set<int> uset;//每层新建一个,用于本层去重
for (int i=st;i<nums.size();i++) {
if ((!path.empty() && nums[i]<path.back()) //排除不递增的情况
|| uset.find(nums[i])!=uset.end())//找到了说明之前用过了,同样不行。下一层可以用,但在本层不能用
continue;
uset.insert(nums[i]);
path.push_back(nums[i]);
trace(nums,i+1);
path.pop_back();
}
return ;
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
trace(nums,0);
return res;
}
};
更多推荐
所有评论(0)