首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++如何在数组中找到最长可能的递减数字组合

要在C++中找到数组中最长可能的递减数字组合,可以使用动态规划的方法来解决。下面是一个可能的实现:

代码语言:txt
复制
#include <iostream>
#include <vector>

using namespace std;

vector<int> findLongestDecreasingSubsequence(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 1); // dp[i]表示以nums[i]结尾的最长递减子序列的长度

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[j] > nums[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }

    int maxLength = 0;
    int endIndex = 0;
    for (int i = 0; i < n; i++) {
        if (dp[i] > maxLength) {
            maxLength = dp[i];
            endIndex = i;
        }
    }

    vector<int> result;
    while (maxLength > 0) {
        result.insert(result.begin(), nums[endIndex]);
        maxLength--;
        endIndex--;
        while (endIndex >= 0 && dp[endIndex] != maxLength) {
            endIndex--;
        }
    }

    return result;
}

int main() {
    vector<int> nums = {5, 6, 3, 4, 8, 1, 2, 9};
    vector<int> longestDecreasingSubsequence = findLongestDecreasingSubsequence(nums);

    cout << "最长递减子序列为:";
    for (int num : longestDecreasingSubsequence) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

上述代码中,我们使用了一个动态规划数组dp来记录以每个元素结尾的最长递减子序列的长度。然后,我们遍历数组,对于每个元素,再遍历其之前的元素,如果存在比当前元素小的元素,就更新dp数组中的值。最后,我们找到dp数组中的最大值,以及对应的索引,然后根据索引回溯找到最长递减子序列。

对于给定的示例数组{5, 6, 3, 4, 8, 1, 2, 9},最长递减子序列为{8, 2, 1}

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

问与答62: 如何按指定个数在Excel中获得一列数据的所有可能组合?

excelperfect Q:数据放置在列A中,我要得到这些数据中任意3个数据的所有可能组合。如下图1所示,列A中存放了5个数据,要得到这5个数据中任意3个数据的所有可能组合,如列B中所示。...如何实现? ? 图1 (注:这是无意在ozgrid.com中看到的一个问题,我觉得程序编写得很巧妙,使用了递归的方法来解决,非常简洁,特将该解答稍作整理后辑录于此与大家分享!)...A Set rng =Range("A1", Range("A1").End(xlDown)) '设置每个组合需要的数据个数 n = 3 '在数组中存储要组合的数据...vElements =Application.Index(Application.Transpose(rng), 1, 0) '重定义进行组合的数组大小 ReDim vResult(1...代码的图片版如下: ? 如果将代码中注释掉的代码恢复,也就是将组合结果放置在多列中,运行后的结果如下图2所示。 ? 图2

5.6K30

C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数

数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?...tpId=13&tqId=11190 参与人数:2597    时间限制:1秒   空间限制:32768K 本题知识点: 数组 题目描述 统计一个数字在已排序数组中出现的次数。...样例输入: 2 3 3 3 3 4 51 3 6,5,3,3,1,0 3 样例输出: 4 2 分析:       数字在排序数组中出现的次数,首先想到的方法应该是用hash表,计算出数组中所有数据出现的次数...但这种方法未能利用该数组是已排序的特点,所以如果输入是已排好序的题目,要及时联想到二分查找。...具体步骤:先用二分法找到某个目标值k出现的位置,然后统计前面一半中k出现的次数sum1,后面一半中k出现的次数sum2,最后sum=sum1+1+sum2。二分查找时间复杂度是O(logn)。

61810
  • 最长递减子序列问题

    文章大纲 最长递减子序列 长度 简单解决方案 c++ / python 优化解决方案 c++ / python 如何打印 最长递减子序列 参考文献与学习路径 ---- 最长递减子序列问题是找到给定序列的子序列...,其中子序列的元素按排序顺序从高到低排列,并且子序列尽可能长。...本例中最长的递减子序列并不是唯一的:例如,[12,10,6,5,3]是同一输入序列中另一个等长递减子序列。 我们可以用递归来解决这个问题。...对于每个项目,有两种可能性: 如果当前项目小于LDS中的前一个元素,则将其包含在LDS中,并对其余项目重复出现。 从LDS中排除当前项目,并重复剩余项目。...最后,返回通过包含或排除当前项而获得的最大值。递归的基本情况是没有留下任何项。以下是该想法的C++、Java和Python

    53220

    2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为

    2022-12-22:给定一个数字n,代表数组的长度,给定一个数字m,代表数组每个位置都可以在1~m之间选择数字,所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。返回达标数组的数量。...答案2022-12-22:参考最长递增子序列。代码用rust编写。代码如下:use std::iter::repeat;fn main() { println!...// f、s、t : ends数组中放置的数字!...// n : 一共的长度!// m : 每一位,都可以在1~m中随意选择数字// 返回值:i..... 有几个合法的数组!...// 尤其是理解ends数组的意义!fn number2(n: i32, m: i32) -> i32 { //repeat(vec!

    2.1K20

    公司数据结构+算法面试100题

    第21题(数组) 2010年中兴面试题 编程求解: 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来....在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr所指内存。...比如两对括号可以有两种:()()和(()) 47.创新工场(算法): 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 48.微软(运算): 一个数组是由一个递减数列左移若干位形成的...限制: 输入每行的最大数字个数为100000个,数字最长为6位。程序无内存使用限制。 93.在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。 直观想法是用两个数组a、b。...给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。 94.微软笔试题 求随机数构成的数组中找到长度大于=3的最长的等差数列9 d- x' W) w9 ?"

    3.3K90

    单调栈详解及其LeetCode应用详解

    单调栈在算法中的应用在于它能够在一次扫描即O(n)的复杂度之内找到数组中每一个元素的前上界(单增栈)或者前下界(单减栈)。...pid=21283868&qid=830860&tid=37511217 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M 小Q在周末的时候和他的小伙伴来到大城市逛街...(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 输入描述: 输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1的高度。...1<=n<=100000; 1<=wi<=100000; 输出描述: 输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。...递减栈保存了比当前元素更大的元素 如果当前元素最大 则递减栈为空 // 从右向左构造递减栈相当于从左向右找下一个最大的数 如果这个方向找不到可能要尝试从右向左找 // 但循环数组是一个痛点 // 联系到循环队列的数组实现是使用模运算来实现循环的

    3.8K11

    LeetCode热题100(哈希篇)

    我想到还可以对数组排序啊,排序后的相同字母的组合单词一定相同,而且效率更高。...最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。...思路 假设题目没有要O(n)的时间复杂度的话,肯定就是先将数组排序后在遍历数组计算最长的连续序列。 那么该如何只用O(n)的时间复杂度来完成这道题呢?...排序的目的是为了让连续的数字在物理层面紧挨在一起,不排序的话,现在让它们逻辑上挨在一起就行了。我们可以利用哈希表来实现数字在逻辑方面挨在一起。...哈希表的key就是数字,value则为包含key的最长连续序列的长度。 那么现在的问题就变成的如何用value表示包含key的最长连续序列的长度。

    7700

    C++进阶高级练习试题

    基于插入的写法 基于交换的写法 【注】全排序的时间复杂度 组合 组合(n 选 k,无重复) 组合(n 选 k,有重复) 组合总和(数字不重复但可重复使用) 组合总和 2(存在重复数字但每个数字只能使用一次...全排列 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。...种不同的排列; 考虑第一个位置,有 n 种可能 当选定了第一个位置,第二个位置有 n-1 种可能 因为每次搜索的状态数是递减的,所以这里的 dfs 是一个循环递归的过程 基于插入的写法 代码量多一点,但比较好理解...组合 问题描述 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。...组合总和 II 思路 DFS,关键是如何去除重复情况 C++ class Solution { vector > ret; vector tmp;

    1.3K30

    动态规划入门——在转移的时候使用二分法加速查找

    当然我们也可以用搜索来做,我们可以在搜索的过程当中排除掉非法的组合,但在极端情况下,比如整个数组升序的时候,那么还是会枚举到所有的情况,那么整体的复杂度依然是。这显然是我们不能接受的。...也有可能答案是1,当序列是递减的时候。 表面上看我们什么也没有发现,并没有找出一个好的方案来解决问题,但是其实已经有一个很重要的结论摆在了我们面前——这个最长不下降的序列并不一定包含最后一个元素。...所以我们自然地得出结论,所有位置都有可能是答案的结尾。 这个其实很好证明,我们来看下面这张图: ? 在这个序列当中,a1, a2到ai递增,从ai+1开始递减,并且,那么显然[a1. a2,......而且对于一个确定的位置而言,以它为结尾的最长不下降子序列必然也是确定的(可能有多种情况)。...比如上图当中2排在数组当中的第二位,那么就说明2这个数字对应的答案是2。 我们更新dp数组的过程主要做了两件事,第一件事是让dp数组当中的元素尽量多,我们每次都会把最大的数插入dp的末尾。

    85410

    凉经算法题反思 | 单调栈与DP二分法

    这个过程引用到了单调栈的思想。就是一个栈,里面所有元素是非严格单调递增或者单调递减的。比较好思考,就是每一个数组都要越来越小,如果不满足递减的数字,说明要从栈中取出来几个数字了。...比如:【1,2,4,2,5,3】,最长递增子数组是【1,2,4,5】 最长递增数组Longest Increasing Sequence,下面缩写LIS。...解法:这道题如果单纯的使用动态规划方法,可以得到 的时间复杂度;如果使用二分法,可以得到 的复杂度。这道题关键在于用二分法的时候,如何找到有序数组进行查找。...此外,我们用一个变量Len来记录现在最长算到多少了 首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。...二分法的关键在于单调数组中查找某一个数字的位置;动态规划在于寻找子优化问题;二分法的写法可以背住,到时候直接写出来就行不用动脑子。

    71320

    单调栈

    单调栈在算法中的应用在于它能够在一次扫描即O(n)的复杂度之内找到数组中每一个元素的前上界(单增栈)或者前下界(单减栈)。...pid=21283868&qid=830860&tid=37511217 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M 小Q在周末的时候和他的小伙伴来到大城市逛街...(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 输入描述: 输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1的高度。...1<=n<=100000; 1<=wi<=100000; 输出描述: 输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。...在所有计算的面积中找到最大的即可 # 巧妙的利用了递增栈的性质 class Solution: def largestRectangleArea(self, heights: List[int

    70820

    2024-11-24:最长的严格递增或递减子数组。用go语言,给定一个整数数组 nums,请找出其中最长的严格递增或严格递减的非

    2024-11-24:最长的严格递增或递减子数组。用go语言,给定一个整数数组 nums,请找出其中最长的严格递增或严格递减的非空子数组的长度并返回。 输入:nums = [1,4,3,3,2]。...大体步骤如下: 1.初始化变量: • 创建一个变量 ans,用于存储当前找到的最长递增或递减子数组的长度,初始值设为 0。 • 获取输入数组的长度 n。...此时,检查 down 是否为 1(表示当前不是在递减子数组中),如果是,那么就可以将 upper 增加 1。...• 使用 ans = max(ans, down) 更新 ans 为当前找到的最长严格递减子数组和 ans 的最大值。...7.返回结果: • 当外层循环结束后,返回 ans,这时 ans 包含了所有可能的严格递增或递减子数组中的最大长度。

    6210

    快速拿下面试算法

    快速拿下面试算法 在面试前一周,我刷了很多道算法,分类刷,有些是做过的,因为我是面试C++相关岗位,除了leetcode与剑指offer相关的算法,还需要手撕一些智能指针呀,单例模式呀、字符串呀、LRU...编辑距离 二分 排序数组,平方后,数组当中有多少不同的数字(相同算一个) 一个数据先递增再递减,找出数组不重复的个数,比如 [1, 3, 9, 1],结果为3,不能使用额外空间,复杂度o(n) 递增数组...,找出和为k的数对 给出一个数组nums,一个值k,找出数组中的两个下标 i,j 使得 nums[i] + nums[j] = k 滑动窗口 3.无重复字符的最长子串 字符串的排列 排序 插入排序 冒泡排序...快速排序 三路快排 归并排序 sum问题 两数之和 三数之和 nSum 大数之和 栈 71.简化路径 哈希表及Union-Find 128.最长连续序列 一个无序数组,从小到大找到第一个缺的数,比如[...求根到叶子节点数字之和 最小路径和 124. 二叉树中的最大路径和 112.路径总和 113.路径总和 II 剑指 Offer 07.

    55220

    【面试高频题】难度 45,单调栈的热门运用

    因此我们找到了满足 132 结构的组合。 这样做的本质是:我们通过维护「单调递减」来确保已经找到了有效的 (j,k)。换句话说如果 k 有值的话,那么必然是因为有 j > k,导致的有值。...我们不失一般性的考虑任意数组 nums,假如真实存在 ijk 符合 132 的结构(这里的 ijk 特指所有满足 132 结构要求的组合中 k 最大的那个组合)。...,说明 k 还在栈中,而遍历位置已经到达了 i,说明 j 和 k 同时在栈中,与「单调递减」的性质冲突。...这时候变量的值要比真实情况下的 k 要大,说明在 k 出栈之后,有比 k 更大的数值出栈了(同时必然有比变量更大的值在栈中),这时候要么与我们假设 ijk 是 k 最大的组合冲突;要么与我们遍历到的位置为...综上,由于「单调递减」的性质,我们至少能找到「遍历过程中」所有符合条件的 ijk 中 k 最大的那个组合。

    43320

    【优选算法篇】算法江湖中的碎玉拾光——C++模拟题全解,踏步逐章细细品味

    分享给更多人:欢迎分享给更多对 C++ 感兴趣的朋友,一起学习字符串操作和模拟题解! 前言 在算法学习中,模拟题往往以其具体的操作流程和生动的应用场景为初学者提供了宝贵的实践机会。...本篇文章将从一道经典的 C++ 模拟题“替换所有问号”出发,带你逐步解析如何在字符操作和条件约束中找到最佳的解决方案,帮助你打好算法学习的基础。...在完成所有转换(可能无需转换)后,返回最终的字符串。如果有多个解决方案,返回其中任何一个即可。 示例 1: 输入:s = "?...给定一个非递减的整数数组 timeSeries,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,和一个表示中毒持续时间的整数 duration。...数青蛙 题目描述 给定一个字符串 croakOfFrogs,表示青蛙发出的 “croak” 叫声的组合。可以有多只青蛙同时叫,因此字符串中可能会包含多个 “croak”。

    10310

    菜鸟刷题Day8

    还有就是在判断是否严格递增或者递减的时候,为了避免在不同的层有不同的条件判断,可以设置一个flag=1(因为第0层是偶数层要递增),并通过flag= - flag来更新,在不同层只要将相邻的两个数乘上flag...最长和谐子序列 - 力扣(LeetCode) 描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。...现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。...但是这题的测试用例中会有负数,所以这中办法跑不过,毕竟下标没有负数。 要找的是两者之间差值为1,并且要是最长的。所以首先将这个数组排序,这样会比较好找。...,就代表end与begin之间的元素差值一定不是1,而这个数组是一个有序数组,也就是说在移动begin的时候不用移动end,所以可以直接用end作为循环结束的条件。

    23510

    【C++】算法集锦(7)滑动窗口

    文章目录 从LeetCode上的一道题说起 无重复字符的最长子串 思路: 代码实现: 从LeetCode上的一道题说起 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥...看到这个题,我不知道大家是怎么想的,我想到的就是暴力解法: 1、从头开始,以每个数字作为结果数组的头,找到刚好能大于s的结果数组。...并记下结果数组中 [1:] 的和(Python写法),记为 t 。 2、如果 t 已经大于 s 了,那就结果数组头开始递减,一直减到 t 刚好小于 s 为止。 3、时刻保留一个最短子序列。...无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。...其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列! 如何移动?

    91110

    【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻

    在基础篇中,我们已经学习了如何利用双指针优化简单数组问题,而在这一篇中,我们将进一步深入探讨双指针的高级应用场景,包括排序问题、多数之和等经典题型的双指针解法,以及如何利用双指针快速解决复杂的数组与链表问题...解法二(排序 + 双指针) 算法思路: 先将数组排序。 根据「解法一」中的优化思想,可以固定一个「最长边」,然后在比这条边小的有序数组中找出一个二元组,使这个二元组之和大于这个最长边。...此方法非常适合在数组问题中应用,能够快速找到所有满足条件的组合。 第二章:和为 s 的两个数字 2.1 和为 s 的两个数字 题目链接:剑指 Offer 57....和为s的两个数字 题目描述:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。如果有多对数字的和等于 s,则输出任意一对即可。...以上就是关于【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

    10520

    【算法专题】动态规划之子数组和子串系列

    的非空 子数组 的最大可能和 。...一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。...但是,问题来了,如果状态表示这样定义的话,以 i 位置为结尾的最长湍流数组的长度我们没法从之前的状态推导出来。因为我们不知道前一个最长湍流数组的结尾处是递增的,还是递减的。...因此,我们需要状态表示能表示多一点的信息:要能让我们知道这一个最长湍流数组的结尾是「递增」的还是「递减」的; 因此需要两个 dp 表: f[i] 表示:以 i 位置元素为结尾的所有子数组中,最后呈现「上升状态...其中前面部分我们可以在 dp[j - 1] 中找到答案,后面部分的子串可以在字典里面找到。

    29410
    领券