- 300 最长递增子序列
- 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
解题思路:动态规划,dp[i]代表以i个数字结尾的最长子序列长度,通过与其之前位j 的数字大小,若nums[i]>nums[j],则dp[i] = dp[j]+1。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
// solution 1:
// vector<vector<int>> dp(nums.size(),vector<int>(nums.size(),1));
// int result =1;
// for(int i=nums.size()-2;i>=0; --i){
// int max_ = INT_MIN;
// for(int j=i+1;j<nums.size();++j){
// if(nums[i]<nums[j]) dp[i][j] = dp[j][j]+1;
// else dp[i][j] = 1;
// max_ = max(max_, dp[i][j]);
// }
// dp[i][i] = max_;
// result = max(result,dp[i][i]);
// }
// return result;
//solution 2
// vector<int> dp(nums.size(),1);
// int max_ = 1;
// for (int i =1; i<nums.size(); ++i){
// dp[i] = maxDP(nums,dp, i)+1;
// max_ = max(max_, dp[i]);
// }
// return max_;
vector<int> dp(nums.size(),0);
int max_ =1;
for(int i=0; i<nums.size(); ++i){
dp[i]=1;
for(int j=0; j<i; ++j){
if(nums[i]>nums[j]) dp[i] = max(dp[i], dp[j]+1);
}
max_ =max(max_, dp[i]);
}
return max_;
}
//solution 2
// int maxDP(vector<int> nums, vector<int> dp, int len){
// int max_ = 0;
// for(int i =0; i<len; ++i){
// if(nums[len]>nums[i]){
// max_ = max(max_, dp[i]);
// }
// }
// return max_;
// }
};