开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个整数数组 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());;
}
};
提交排名
四、总结
方法很巧妙,要多看看!而且*max_element(dp.begin(), dp.end())可以求容器内的最大值也是第一次见到。