首页 > 其他分享 >LeetCode 300. 最长递增子序列

LeetCode 300. 最长递增子序列

时间:2023-10-23 10:32:24浏览次数:43  
标签:题目 nums 300 递增 我们 数组 序列 LeetCode dp


最长递增子序列

题目链接:

300. 最长递增子序列

题目描述:

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3] 输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7] 输出:1

题目解析

在这个之前,我们说一下什么是子序列,我们可以将子序列看成数组的子集, 只不过这个子集有一定的要求,我们原本元素的相对位置是不能够改变的.例如下面的这样

LeetCode 300. 最长递增子序列_算法

这道题目我们求最长的子数组很相似,思路也是类似的.题目求的是我们数组的最长的子序列的长度.

算法原理

还是按照经验,我们这里仍旧按照之前的想法来.

  • 以…为结尾
  • 以…为开始

状态表示

根据题目分析,我们选择以…为结尾表示状态.那么我们的状态这样表示

dp[i]:表示以i位置为结尾,我们序列的最大长度

状态转移方程

这里进行分析,我们这里存在两个选择.

  • 一个元素单独作为子序列, 那么dp[i] = 1
  • 和前面的元素打配合共同构成子序列, 那么此时我们需要遍历我们的前面的dp

解释一下我们第二个选择, 我们直到子序列是可以不连续的,那么此时我们就会出现这样的情况.

LeetCode 300. 最长递增子序列_算法_02

那么遍历我们前面的结果,此时我们需要找到前面的最大值.

LeetCode 300. 最长递增子序列_数组_03

初始化

初始化就简单了,我们这里直接初始为1可以,默认是第一个情况.

填表顺序

从左向由填.

返回值

题目要求的最大长度,那么我们这里使用一个变量保存最大就可以了.

编写代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int result = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            for(int j = i-1; j >=0; j--)
            {
                if(nums[j] < nums[i])
                {
                    dp[i] = max(dp[j] + 1,  dp[i]);
                }
            }
            result = max(result,   dp[i] );
        }
        return result;
    }
};

LeetCode 300. 最长递增子序列_数组_04


标签:题目,nums,300,递增,我们,数组,序列,LeetCode,dp
From: https://blog.51cto.com/byte/7983876

相关文章

  • LeetCode 376. 摆动序列
    最长递增子序列题目链接:376.摆动序列题目描述:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值......
  • leetcode102-二叉树层序遍历
    目标:将每层的结果放在每层的集合中问题:如何将不同父节点的同层节点,例如4和6,按照顺序放在一个list中思路:4和6的关联在与它们的父节点,遍历他们的父节点时将其子节点放在一个缓存队列中,从队列中取值就能够实现目标代码:点击查看代码classSolution{publicList<List<Inte......
  • Leetcode原题 -- 螺旋矩阵相关
    第一题:54. 螺旋矩阵题目描述:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]解题思路:按层遍历,如图所示,找到规律后就差不多了publicList<Integer>spiral......
  • 6.使用leetcode去练习语言
    目录1本章预览2简单题举例2.1题目描述2.2题目解析2.3题解2.4涉及基础语法3中等题举例3.1题目描述3.2题目解析3.3题解3.4涉及基础语法4本章小结1本章预览事实上本章并不会去讲述go语言的基础情况,而是去介绍如何使用Leetcode去帮助我们去学习go语言的基本语法,当然本......
  • 算法训练day39LeetCode738.968.
    算法训练day39LeetCode738.968.738.单调递增的数字题目738.单调递增的数字-力扣(LeetCode)题解代码随想录(programmercarl.com)classSolution{public:intmonotoneIncreasingDigits(intn){stringstrNum=to_string(n);//int转换string......
  • [LeetCode] 1726. Tuple with Same Product
    Givenanarray nums of distinct positiveintegers,return thenumberoftuples (a,b,c,d) suchthat a*b=c*d where a, b, c,and d areelementsof nums,and a!=b!=c!=d.Example1:Input:nums=[2,3,4,6]Output:8Explanation:Ther......
  • [Leetcode] 0083. 删除排序链表中的重复元素
    83.删除排序链表中的重复元素题目描述给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。 示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3] 提示:链表中节点数目在范围[0,300]......
  • [Leetcode] 0070. 爬楼梯
    70.爬楼梯题目描述假设你正在爬楼梯。需要n 阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1......
  • 算法训练day37 LeetCode860.406.452.
    算法训练day37LeetCode860.406.452.860.柠檬水找零题目860.柠檬水找零-力扣(LeetCode)题解代码随想录(programmercarl.com)5:收五元10:收十元,返五元20:优先还十元+五元;否则还五元*3classSolution{public:boollemonadeChange(vector<int>&bills)......
  • [Leetcode] 0069. x 的平方根
    69.x的平方根题目描述给你一个非负整数x,计算并返回 x 的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x**0.5。 示例1:输入:x=4输出:2示例2:输入:x=8输出:2解释......