Longest Increasing Subsequence 最长递增子序列
子序列不是数组中连续的数。
dp表达的意思是以i结尾的最长子序列,而不是前i个数字的最长子序列。
初始化是dp所有的都为1,最终的结果是求dp所有的数值的最大值。
class Solution { public: int lengthOfLIS(vector<int>& nums) { int length = nums.size(); if(length <= 0) return 0; vector<int> dp(length,1); int max_num; for(int i = 1;i < length;i++){ max_num = 1; for(int j = i - 1;j >= 0;j--){ if(nums[i] > nums[j]) max_num = max(max_num,dp[j] + 1); } dp[i] = max_num; } max_num = 1; for(int i = 0;i < length;i++){ if(dp[i] > max_num) max_num = dp[i]; } return max_num; } };
674. Longest Continuous Increasing Subsequence
相对于最长递增子序列来说,这个题目更加简单,只需要比较前一个数字就好,不用把前面的数字都比较完。因为如果比前一个小,直接就无法完成递增,只能保持当前的值1;如果比前一个数字大,其实前一个数字就已经计算了之前递增的个数,直接加1就好了
class Solution { public: int findLengthOfLCIS(vector<int>& nums) { if(nums.empty()) return 0; int length = nums.size(); vector<int> dp(length,1); for(int i = 1;i < length;i++){ if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1; } int max_num = 1; for(int i = 0;i < length;i++) max_num = max(max_num,dp[i]); return max_num; } };