查找一个数组中的所有递增子序列


题目说明

查找给定的一个数组中的所有递增子序列,子序列长度>=2并且可以为本身

解释说明

给定一个数组,查找一个所有递增子序列,可以简化成从数组中找到所有长度为2、3、4......n的递增子序列,而为了从中找到长度为i的递增子序列,我们可以利用深度优先搜索的方式,先将一个数入栈,然后进行向后的深度搜索,找到一个大于等于栈底的元素,就可以再次入栈,再进行深度搜索,直到遍历完整个数组
同时,我们为了高效利用每一个找到的递增子序列,例如长度为2的递增子序列一定包含在长度为3的递增子序列中,所以我们可以直接遍历一遍数组,将其中每次深度优先搜索完后长度大于1的序列保存,这样就可以成功找到所有递增子序列

代码

List<List<Integer>> lists = new LinkedList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
    List<Integer> list = new LinkedList<>();
    dfs(nums,-1,list);
    return lists;
}
private void dfs(int[] nums, int now_local, List<Integer> list) {
    if (list.size() > 1) {
        lists.add(new LinkedList<>(list));//注意是new一下,因为后面会修改list的内容
    }
    Set<Integer> visited = new HashSet<>();//保存已经被访问的数组元素
    for (int i = now_local + 1; i < nums.length; i++) {
        if (visited.contains(nums[i])) { 
            continue;
        }
        visited.add(nums[i]);
        if (now_local == -1 || nums[i] >= nums[now_local]) {
            list.add(nums[i]);
            dfs(nums, i, list);
            list.remove(list.size() - 1);
        }
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM