【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段)

这篇具有很好参考价值的文章主要介绍了【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段),浅浅的刷亿点题吧,算法,数据结构,c++

Today’s quote is: "Actions speak louder than words.

今天的一句话是:“行动胜于言辞

01 | 👑 题目描述

求最长递增子序列

最长递增子序列是指在给定序列中,找到一个最长的子序列,使得子序列中的元素按照递增的顺序排列。

例如,对于序列 [1, 3, 2, 5, 4, 7, 6],其中的最长递增子序列可以是 [1, 2, 4, 6] 或者 [1, 3, 5, 7]。这些子序列中的元素按照递增的顺序排列,且长度为4,是该原始序列中最长的递增子序列。

02 | 🔋 解题思路

求解最长递增子序列可以使用动态规划的方法,下面是一种常用的解题思路和流程:

  1. 定义一个数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度。

  2. 初始化 dp 数组,将所有元素的初始值设为 1,即每个元素自身都可以构成一个长度为 1 的递增子序列。

  3. 从左到右遍历原始序列,对于每个位置 i,比较其前面的所有位置 j(j = 0 to i-1),如果 nums[i] 大于 nums[j],说明 nums[i] 可以接在 nums[j] 后面形成一个更长的递增子序列。此时更新 dp[i] 的值为 max(dp[i], dp[j] + 1)。

  4. 遍历完整个序列后,dp 数组中的最大值即为最长递增子序列的长度。

  5. 为了还原最长递增子序列本身,我们可以在更新 dp 数组的过程中,记录每个位置 i 的最佳前驱位置 prev[i],表示以第 i 个元素结尾的最长递增子序列的前驱元素的位置。通过这个 prev 数组,我们可以从最后一个元素开始,通过不断回溯找到整个最长递增子序列。

  6. 最后,根据 prev 数组和最长递增子序列的长度构建最长递增子序列。

时间 && 空间复杂度

  • 时间复杂度O(n^2)
    嵌套的两个循环遍历,外层循环遍历 n 次,内层循环遍历 i 次(i = 0 to n-1)
  • 空间复杂度**O(n) **
    使用了一个长度为 n 的数组 dp 来存储每个位置的最长递增子序列长度,以及一个长度为 n 的数组 prev 来存储每个位置的最佳前驱位置

03 | 🧢 代码片段

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> longest_increasing_subsequence(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 1);
    vector<int> prev(n, -1);

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

    int max_len = *max_element(dp.begin(), dp.end());
    int idx = find(dp.begin(), dp.end(), max_len) - dp.begin();

    vector<int> sequence;
    while (idx != -1) {
        sequence.push_back(nums[idx]);
        idx = prev[idx];
    }

    reverse(sequence.begin(), sequence.end());

    return sequence;
}

int main() {
    vector<int> nums = {1, 3, 2, 5, 4, 7, 6};
    vector<int> result = longest_increasing_subsequence(nums);

    cout << "Longest Increasing Subsequence: ";
    for (int num : result) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}


【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段),浅浅的刷亿点题吧,算法,数据结构,c++

【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段),浅浅的刷亿点题吧,算法,数据结构,c++文章来源地址https://www.toymoban.com/news/detail-522547.html

各位大佬点点关注,点赞,收藏,有空的时候再回来看看,谢谢

到了这里,关于【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日算法 && 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)

    When you feel like giving up, remember why you started. 当你想放弃时,请记住为什么你开始 给你两个数组,请分别求出两个数组的交集和并集 在数学中,我们可以通过交集和并集来描述两个集合之间的关系。 交集(Intersection) :指的是两个集合中共有的元素组成的集合。可以用符号

    2024年02月11日
    浏览(36)
  • 【每日算法 && 数据结构(C++)】—— 01 | 平方值去重统计(解题思路STL法,双指针法、流程图、代码片段)

    “Success is not final, failure is not fatal: It is the courage to continue that counts.” - Winston Churchill (成功并非终点,失败并非致命:真正重要的是继续前行的勇气 - 温斯顿·丘吉尔) 给你一个整数数组,数组中的数可以是正数、负数、零,请实现一个函数,返回这个数组中所有数的平方

    2024年02月12日
    浏览(41)
  • 青岛大学_王卓老师【数据结构与算法】Week05_13_队列的顺序表示和实现1_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周13–3.5队列的表示和实现2–

    2024年02月17日
    浏览(32)
  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(33)
  • 二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

    各位CSDN的uu们你们好呀,今天继续数据结构与算法专栏中的二叉树,下面,让我们进入二叉树的世界吧!!! 二叉树(上)——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链式结构的实现 二叉树链式结构的实现 求二叉树的高度 但是这种写法有很大的问题

    2024年02月17日
    浏览(29)
  • 数据结构入门-13-图

    1.2.1 无向图 1.2.2 有向图 1.2.3 无权图 1.2.4 有劝图 两点相邻 点的邻边 路径Path,从一个点到另一个点走过的路 环Loop,多个点围城一个圈 自环边,自己和自己形成环 平行边,重复的边 联通分量 无环图 树是一种无环图,一个联通的无环图(一个联通分量)就是树 连通图的 生成树

    2024年02月09日
    浏览(25)
  • 数据结构 每日一练 :选择 + 编程

    目录 选择 编程 A .   a[0][2*1]     B.  a[1][3]   C.  a[4-2][0]  D.  a[0][2+2] 答案:D 解析:题目给的是一个3行4列的数组,而D选项是 a[0][2+2] = a[0][4],相当于取得是第1行第5列的元素,越界了。需要注意的是数组下表是从0开始的。下标从0开始!下标从0开始!下标从0开始! A. 

    2024年02月09日
    浏览(34)
  • 数据结构day1(2023.7.13)

       练习1:static(全局变量、局部变量作用域)  练习2:判断变量处于用户空间的哪个区  练习3:在堆区申请连续的n个空间,实现循环输入,循环输出 、释放空间  练习4:数据定义与数据类型  练习5:typedef小练  定义字符指针,分别指向堆区空间,计算字符串的长度 要

    2024年02月16日
    浏览(29)
  • 数据结构——lesson13排序之计数排序

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 、排序算法合集 💥对于数据结构顺序表、链表、堆以及排序有疑问的都可以在上面数据结构专栏和排序合集专栏进行

    2024年04月10日
    浏览(34)
  • 数据结构:力扣OJ题(每日一练)

    目录 题一:环形链表 思路一: 题二:复制带随机指针的链表  思路一: 本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵! 给定一个链表的头节点   head  ,返回链表开始入环的第一个节点。  如果链表无环,则返回  null 。 如果链表中有某个节

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包