zoukankan      html  css  js  c++  java
  • 【LeetCode】491.递增子序列(回溯)

    题目链接

    491. 递增子序列

    题目描述

    给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

    示例:
    
    输入: [4, 6, 7, 7]
    输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
    
    说明:
    给定数组的长度不会超过15。
    数组中的整数范围是 [-100,100]。
    给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
    

    解题思路

    1.回溯法

    如果所示,画出了回溯的一小部分,

    除了直接套用回溯(DFS)的模板以外,还需要注意去重操作!

    最左侧DFS的结果
    [4,6]
    [4,6,7]
    [4,6,7,7]
    紧接着回溯
    [4,6,7] (重复出现)
    回溯
    [4,7]
    [4,7,7]
    回溯
    [4,7]重复
    

    所以我们需要利用Hashset进行去重操作!

    AC代码

    1.回溯法

    class Solution {
    
        List<List<Integer>> ans = new LinkedList<>();  
        LinkedList<Integer> temp = new LinkedList<>();
        Set<LinkedList<Integer> > s = new HashSet<>();
    
        void dfs (int index,int[] nums){
            if(index > nums.length) return;
            if(temp.size() > 1){
                //必须new一个新的LinkedList对象,否则ans内容错误。
                LinkedList<Integer> app = new LinkedList<>(temp);
                //插入成功返回true,插入失败也就是已经存在该元素返回false
                boolean f = s.add(app);
                if(f)  ans.add(app);
            }
            for(int i = index; i < nums.length; i++){
                if(temp.size()==0 || nums[i] >= temp.peekLast()){
                    temp.add(nums[i]);
                    dfs(i+1,nums);
                    //removeLast()体现了回溯操作。
                    temp.removeLast();
                }
            }
        }
    
        public List<List<Integer>> findSubsequences(int[] nums) {
            dfs(0,nums);
            return ans;
        }
    }
    
  • 相关阅读:
    java实现九九乘法表
    for循环的阶乘
    Struts2 表单提交与execute()方法的结合使用
    Struts2 第三个程序 namespacce的用法
    java 字符串的比较compareTo
    java中的位预算
    java调用C++ DLL库方法
    Socket编程模式理解与对比
    c 高级函数的简单用法
    TCP粘包分析与处理
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/13560689.html
Copyright © 2011-2022 走看看