首页
学习
活动
专区
工具
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)。

61410
  • 最长递减子序列问题

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

    52120

    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!

    2K20

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

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

    3.7K11

    公司数据结构+算法面试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

    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末尾。

    84710

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

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

    70520

    单调栈

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

    70520

    快速拿下面试算法

    快速拿下面试算法 面试前一周,我刷了很多道算法,分类刷,有些是做过,因为我是面试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.

    55120

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

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

    42220

    菜鸟刷题Day8

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

    23110

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

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

    89910

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

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

    9310

    学会这14种模式,你可以轻松回答任何编码面试问题

    你可以尝试将数字放置正确索引中,但这会导致O(n ^ 2)复杂度不是最佳,因此是循环排序模式。 如何识别这种模式?...该模式通过将数字前半部分存储最大堆中而起作用,这是因为你要在前半部分中找到最大数字。 然后,你想将数字后半部分存储最小堆中,因为你希望在后半部分找到最小数字。...这是子集模式直观表示: 如何识别子集模式: 你需要查找给定集合组合或排列问题 具有子集模式问题: 重复子集(简单) 更改大小写字符串排列(中) 11、修改后二进制搜索 每当给你排序数组,链接列表或矩阵...如果减少,则搜索结束=中间+1 这是"修改后二进制搜索"模式直观表示: 具有修改后二进制搜索模式问题: 与订单无关二进制搜索(简单) 排序无限数组中搜索 12、前K个元素 任何要求我们在给定集合中找到顶部...如何识别K-way合并模式: 该问题将出现排序数组,列表或矩阵 如果问题要求你合并排序列表,请在排序列表中找到最小元素。

    2.9K41

    leetcode每日一题:376.摆动序

    ,并且保证这些摆动子序列连接后仍然是摆动序列,就能得到最长摆动序列。...从前面的假设我们可以知道这个序列满足: # 因为 [j, j+m] 单调递减,而 [i, j] 是摆动序列 # 即从 j+1 开始由于单调减,导致不能继续组合成摆动序列 # 因此摆动序列最后两个元素满足...其实当有差值不等时就加入序列,这样得到最终序列就是最长摆动序列。...接着我们来看下动态规划实现思路: 首先我们要明白,对于一个摆动序列,它结尾有两种可能: 结尾两个元素差值为正 结尾两个元素差值为负 我们通过 P(i) 表示前 i 个元素里结尾两个元素差值是正值最长子序列个数...,我们其实并不需要存储整个数组,只需要前一次状态即可,因此可将两个数组改成两个变量,这样空间复杂度能达到 O(1),优化后代码实现参考如下: from typing import List class

    41320

    【C语言刷题——Leetcode6道简单题】

    罗马数字转整数 这道题,我刚开始一看,觉得挺简单,多种情况用switch语句分情况选择不就行了,直接上手代码,但是却忽略了题目中的话: 通常情况下,罗马数字中小数字数字右边。...数字 1 在数字 5 左边,所表示数等于大数 5 减小数 1 得到数值 4 。同样地,数字 9 表示为 IX。...最长公共前缀 题目的意思就是让你输出最长公共前缀。...非递减顺序 排列,所以如果开辟一个数组存放数据的话,最后要重新把数据复制到num1中,这步操作可以直接调用函数memcpy完成即可。...丢失数字 解题思路:异或 代码: 提交运行: 结语 最近开始忙起来了,可能会出现暂更现象。本次就先到这里结束了!

    35530
    领券