12.05 log

491.递增子序列

c++中关于vector容器的各种函数介绍

https://blog.csdn.net/huxxyyy/article/details/108970041

C++之SET容器常用函数总结

https://blog.csdn.net/vir_lee/article/details/81544618

class Solution {
private:
    vector path;
    vector> result;
    void backtracking(vector& nums,int startIndex){
        if(path.size()>=2) result.push_back(path);
        unordered_set uset;
        for(int i=startIndex;inums[i]||uset.find(nums[i])!=uset.end()) continue;
            path.push_back(nums[i]);
            uset.insert(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
        return;
    }
public:
    vector> findSubsequences(vector& nums) {
        path.clear();
        result.clear();
        backtracking(nums,0);
        return result;
    }
};

这道题是递增子序列,我们不能一上来就排序,会打乱原本的顺序,和子集那题不一样不能先排序去重,要用set容器来去重。

递归的参数为传入的数组,遍历的起始下标startIndex,无返回值;递归的终止条件无,这道题相当于也是和子集那题一样要遍历每一个节点,不同就要去一个递增的序列,所以要求path的集合长度大于1;单层递归逻辑为,先创建一个unordered_set容器用来记录每一层用过的值,用来去重,然后进入for循环横向遍历,先判断nums[i]与path数组里面最后一个值的大小关系,以及nums[i]在前面有没有出现过,用unordered_set容器判断,如果出现过或者值小于path.back()就continue,去判断同层的下一个数。path记录符合要求的值nums[i],uset容器记录nums[i]用于去重,然后进入递归,startIndex传入i+1,然后回溯,uset容器不用回溯,因为进入下一层要自动清空,重新创建。unordered_set uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!

你可能感兴趣的:(算法,java,开发语言)