class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void backTracking(vector<int>& nums, int startIndex) {
if (path.size() != 0 && path.size() != 1) {
res.push_back(path);
}
unordered_set<int> uset;
for (int i = startIndex; i < nums.size(); i++) {
//find函数只有在nums[i]不存在时返回end()
if (uset.find(nums[i]) != uset.end()) {
continue;
}
if (path.size() == 0 || nums[i] >= path.back()) {
uset.insert(nums[i]);
path.push_back(nums[i]);
backTracking(nums, i + 1);
path.pop_back();
}
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
backTracking(nums, 0);
return res;
}
};
难点:首先这题所给的数组里面会出现相同的元素,这个时候我们第一时间想到去重,但是因为他是求递增子序列,用used数组那个方法的话会改变数组里的元素顺序,所以想到用set集合,set集合有个特点就是里面不会有相同的元素,且默认是以升序排列的。
所以我们每次可以把n叉树的一层的索取的数放到这个set里面去,保证了树层去重(利用find函数)。
然后就是结果要求path里的元素大于1。还有剪枝的时候在判断递增前,要加上path.size()等于0的时候也允许加入到path,顺序不能错,先写为0的时候允许insert,或者递增的时候允许insert。顺序错了会报错。
注意:在排列问题中,使用set哈希表进行树层去重可以不需要对数组进行排序,而在集合问题中,一定要排序,才能使用set哈希表进行去重。