491. 递增子序列

491. 递增子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

**输入:**nums = [4,4,3,2,1]
输出:[[4,4]]

提示:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

思考

这里使用回溯法。

主要面临两个问题

举例:求 3 ,1,3的递增序列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMuwF1DM-1654049449113)(https://secure2.wostatic.cn/static/hqKkrGQ68bu1pr76F5Ff7Z/image.png)]

  • 3,1 不递增
    • 因为1小于3直接continue,跳到该层的下一个节点 3

举例:1,1,1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yngPx3I8-1654049449115)(https://secure-bigfile.wostatic.cn/static/r3hF3PPYDSXBQbRCHkKgaE/image.png)]

  • 1 1 1 重复问题
    • 同一父节点下的同层上使用过的元素就不能在使用了,比如 在第一层 1_1使用了 1_2,1_3就不能重复使用。因为存在1_1当遍历到1_2时应该执行continue操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxxNIBBR-1654049449115)(https://secure2.wostatic.cn/static/oAeaAWyPn3znoGPwDxgyjD/image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lelyo9Hb-1654049449116)(https://secure2.wostatic.cn/static/5oKzXdDHC8gBB6tmBGPj9e/image.png)]

代码

package 力扣;

import org.hamcrest.core.Is;
import org.w3c.dom.ls.LSException;
import sun.security.util.Length;

import javax.sound.midi.Soundbank;
import java.time.Year;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author yyq
 * @create 2022-05-31 10:24
 */
public class leetcode491 {
    public static void main(String[] args) {
        leetcode491 l=new leetcode491();
        List<List<Integer>> subsequences = l.findSubsequences(new int[]{1,2,1,1,3 });
        System.out.println(subsequences);
    }

    List<Integer> list=new ArrayList<>();
    List<List<Integer>> lists=new ArrayList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
       int startIndex = 0;
       backTracking(nums,list,lists,startIndex);
       return lists;
    }

    private void backTracking(int[] nums, List<Integer> list, List<List<Integer>> lists, int startIndex) {
        if(list.size()>1)
            lists.add(new ArrayList<>(list));

        for (int i = startIndex; i < nums.length; i++) {

                
            // 剪支 出现 4 2 的情况
            if(list.size()>1&&list.get(list.size()-1)>nums[i])
                 continue;
            // 剪支 出现重复数据
            int flag = 0;
            for (int j = startIndex;j<i;j++){
                 if(nums[j] == nums[i]) {
                     flag=1;
                     break;
                  }
            }
            if(flag==1) continue;


            list.add(nums[i]);
            backTracking(nums,list,lists,i+1);
            list.remove(list.size()-1);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值