首页 > 其他分享 >非递减子序列习题分析

非递减子序列习题分析

时间:2024-12-09 18:58:13浏览次数:11  
标签:nums vector 数组 回溯 序列 path 习题 递减

习题:(leetcode491)

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

分析:

此题要在数组中找出所有的不同递增子序列,我们可以使用回溯进行求解。

对于去重操作是此题的重点。对于求递增子序列,原数组的元素顺序就不能改变,这就不能使用sort进行遍历数组来进行比较去重,所以我们可以介入set或map来进行去重操作。

在使用set或map去重时要注意不可直接作为类成员,要放在每次回溯中。

代码分析:

class Solution {
private:
    vector<vector<int>> result; // 存储所有符合条件的子序列
    vector<int> path; // 存储当前找到的子序列
    // 回溯函数
    void backtracking(std::vector<int>& nums, int startIndex) {
        // 如果当前路径长度大于1,则将其添加到结果中
        if (path.size() > 1) {
            result.push_back(path);
        }
        // 使用数组去重,由于数值范围是[-100, 100],因此偏移100使其变为非负
        int used[201] = {0}; 

        // 从startIndex开始遍历数组
        for (int i = startIndex; i < nums.size(); i++) {
            // 如果当前数字小于路径中的最后一个数字,或者本层已经使用过这个数字,则跳过
            if ((!path.empty() && nums[i] < path.back())
                || used[nums[i] + 100] == 1) {
                continue;
            }
            // 标记当前数字为已使用
            used[nums[i] + 100] = 1;
            // 将当前数字添加到路径中
            path.push_back(nums[i]);
            // 递归调用回溯函数,从下一个索引开始
            backtracking(nums, i + 1);
            // 回溯,移除路径中的最后一个数字
            path.pop_back();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        result.clear(); // 清空结果
        path.clear(); // 清空路径
        backtracking(nums, 0); // 从索引0开始回溯
        return result; // 返回结果
    }
};

标签:nums,vector,数组,回溯,序列,path,习题,递减
From: https://blog.csdn.net/m0_74313252/article/details/144330905

相关文章

  • 合并区间习题分析
    习题:(leetcode56)以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。分析:要得到一个不重叠的区间数组,就是进行比较。为了方便比较,先进行数......
  • 扩散模型+时间序列结合创新方案整理
    今天给大家推荐一个涨点发顶会的好方向:扩散模型+时间序列。这俩热点的结合可以轻松实现“1+1>2”的效果。扩散模型和时间序列的结合是一个新兴且活跃的研究领域,主要应用于时间序列的预测、插补和生成。扩散模型在生成式人工智能领域展示了先进的成果,特别是在时间序列预测中。......
  • 889. 满足条件的01序列
    卡特兰数列的三种方式h(0)=1h(1)=1;1h(n)=h(n-1)*(4*x-2)/(x+1)2C(n)(2*n)/(n+1)3C(2*n)(n)-C(2*n)(n-1)公式1//889.满足条件的01序列.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*https://www.acwing.com/problem/content/891/给定......
  • 指针--习题
    设计一个指针函数,可以将3×3矩阵转置transposeMatrix函数h它接收一个指向包含3个整数的数组的指针(也就是可以用来表示二维数组的一种指针形式)作为参数,这个参数指向了要进行转置操作的3×3矩阵。通过两层嵌套的for循环,实现了矩阵元素的交换来完成转置操作。内层循环从i+......
  • 数组练习题14道【C语言】
    一维数组1键盘录入一组数列,利用冒泡排序将数据由大到小排序/*************************************************************************>FileName:work11.c>Author:sgc>Description:键盘录入一组数列,利用冒泡排序将数据由大到小排序>Cre......
  • 代码随想录算法训练营第二十五天|491.递增子序列、46.全排列、47。全排列ii。
    491.递增子序列1.递归传参:多加一个startIndex来控制每次递归起始位置即可。2.终止条件:其实可以不加终止条件,因为startIndex每次都会+1,不会无线递归,但是题目要求子序列大小至少为2,所以size>2就行。3.单层搜索逻辑:如下图,同一父节点下的同层上的元素使用过就不能再使用了。......
  • 力扣392.判断子序列
    首先本题有两种解题思路:1.利用双指针遍历s与t,挨个判断s中的元素是否在t中存在,具体方法:i,j 两个指针从0开始,如果s[j]==t[i],则i++,j++;如果不等于则只是i++;继续比较s[j]==t[i];直到i=t.size(),跳出循环,最后判断j是否等于s.size()即可。双指针classSolution{......
  • 力扣300.最长递增子序列(动态规划)
    注:本文只是为了记录作者在刷题过程中的一下思路和心得。思路:每次考虑以第i个元素结尾时能够构成的最长子序列。例如:nums=[0,1,3,2],我们从下标为0的元素开始考虑,如果以下标为0的元素结尾,那么这个子序列的长度就为1;然后依次我们考虑后面的元素。当我们考虑到第i个元......
  • Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需
    全文链接:https://tecdat.cn/?p=38496原文出处:拓端数据部落公众号分析师:PengyuanWen 在当今经济研究与商业决策领域,精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标,其发展趋势的精准把握对中国经济高质量发展转型意......
  • LLM学习笔记(17)序列标注任务(训练模型阶段)
    训练模型这段代码的主要功能是构建一个用于序列标注任务的模型,尤其是针对命名实体识别(NER,NamedEntityRecognition)的任务。通过利用BERT模型和Transformers库提供的工具,快速构建一个可用于标注每个token的实体标签的分类器。构建模型具体功能AutoModelFo......