首页 > 其他分享 >LeetCode:491.递增子序列

LeetCode:491.递增子序列

时间:2025-01-18 14:29:02浏览次数:3  
标签:nums int res 递增 491 add new path LeetCode

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录

LeetCode: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]]

  • 这里面因为不能排序,所以不能像组合总和II那样通过if (i > index && candidates[i] == candidates[i - 1]) return这种方式去重,而是需要使用Set<Integer> used来进行树层去重;
  • 收集结果的时候类似子集问题,只是这里多了一个path.size() > 1的条件的限制,下面的代码直接在for循环里面收集了
	public List<List<Integer>> findSubsequences(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        backtracking(nums, 0, new ArrayList<>(), res);
        return res;
    }

    private void backtracking(int[] nums, int index, List<Integer> path, List<List<Integer>> res) {
        // 这里的set是用于树层去重的
        Set<Integer> used = new HashSet<>();
        for (int i = index; i < nums.length; i++) {
            if (used.contains(nums[i]))
                continue;
            if (path.size() >= 1) {
                if (path.get(path.size() - 1) <= nums[i]) {
                    path.add(nums[i]);
                    used.add(nums[i]);
                    // 收集结果
                    res.add(new ArrayList(path));
                    backtracking(nums, i + 1, path, res);
                    path.removeLast();
                }
            } else {
                path.add(nums[i]);
                used.add(nums[i]);
                backtracking(nums, i + 1, path, res);
                path.removeLast();
            }
        }
    }

简化后:

	public List<List<Integer>> findSubsequences(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        backtracking(nums, 0, new ArrayList<>(), res);
        return res;
    }

    private void backtracking(int[] nums, int index, List<Integer> path, List<List<Integer>> res) {
        if (path.size() > 1) {
            res.add(new ArrayList(path));
            // 这里面收集结果的时候不能return, 否则只能收集到长度为2的结果
            // return;
        }

        // 这里的set是用于树层去重的
        Set<Integer> used = new HashSet<>();
        for (int i = index; i < nums.length; i++) {
            if (used.contains(nums[i]))
                continue;
            if (!path.isEmpty() && path.get(path.size() - 1) > nums[i])
                continue;

            path.add(nums[i]);
            used.add(nums[i]);
            backtracking(nums, i + 1, path, res);
            path.removeLast();
        }
    }

标签:nums,int,res,递增,491,add,new,path,LeetCode
From: https://blog.csdn.net/xiaoshiguang3/article/details/145226886

相关文章

  • LeetCode:90.子集II
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:90.子集II给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。......
  • leetcode——接雨水(java)
    给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。示例......
  • leetcode——令牌放置(java)
    你的初始能量为power,初始分数为0,只有一包令牌以整数数组tokens给出。其中tokens[i]是第i个令牌的值(下标从0开始)。你的目标是通过有策略地使用这些令牌以最大化总分数。在一次行动中,你可以用两种方式中的一种来使用一个未被使用的令牌(但不是对同一个令牌使......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • leetcode第390场周赛
    目录100245.每个字符最多出现两次的最长子字符串100228.执行操作使数据元素之和大于等于K100258.最高频率的ID100268.最长公共后缀查询leetcode第390场周赛100245.每个字符最多出现两次的最长子字符串题意给定一个长度小于等于100的仅由小写字母构成的字符串,请你......
  • LeetCode | 图文详细描述动态规划DP算法及经典题型
    本文将用简单直白的方式,从零开始带你掌握动态规划的精髓。你会发现:动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现,手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”,全都有图、有代码、有思路。看完这篇文章,动态规划......
  • LeetCode:100.相同的树
    LeetCode:100.相同的树两个树:根节点的值相同,左子树相同,右子树相同。符合“分、解、合”特性。考虑选择分而治之。分:获取两个树的左子树和右子树。解:递归地判断两个树的左子树是否相同,右子树是否相同。合:将上述结果合并,如果根节点的值也相同,树就相同。/***Definitionforab......
  • 【LeetCode 刷题】数组-模拟-螺旋矩阵
    此博客为《代码随想录》数组章节的学习笔记,主要内容为数组模拟的相关题目解析。文章目录59.螺旋矩阵II54.螺旋矩阵59.螺旋矩阵II题目链接classSolution:defgenerateMatrix(self,n:int)->List[List[int]]:l,r,t,b=0,n-1,0,n-......
  • 【LeetCode 刷题】数组-滑动窗口
    此博客为《代码随想录》数组章节的学习笔记,主要内容为滑动窗口知识点的相关题目解析。文章目录209.长度最小的子数组904.水果成篮76.最小覆盖子串209.长度最小的子数组题目链接classSolution:defminSubArrayLen(self,target:int,nums:List[int])->......
  • LeetCode 1773. 统计匹配检索规则的物品数量
    在这个问题中,我们被要求统计一个物品数组中满足特定检索规则的物品数量。每个物品由其类型、颜色和名称定义,而检索规则由规则键和规则值指定。我们的任务是找出数组中满足这些规则的物品数量。问题描述解题思路定义索引映射:首先,我们需要定义一个映射,将规则键("type"、"color......