LeetCode 300. 最长递增子序列(c++)

105 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

二、思路分析

这题首先是创建了一个容器dp,设dp[i]为前i个元素,以第i个数字结尾的最长上升子序列的长度。首先从数组中的第一个元素开始,那当然就是dp[0]=1。

接着看第二个元素,是否大于第一个元素,是的话dp[1]=dp[0]+1,不是的话dp[1]=1。

再接着是第三个元素,此时要看它是否大于第一个元素,还要看它是否大于第二个元素,分别进行比较后取最大值得到了dp[2]。

三、AC代码

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

提交排名

image.png

四、总结

方法很巧妙,要多看看!而且*max_element(dp.begin(), dp.end())可以求容器内的最大值也是第一次见到。