当前位置:   article > 正文

(动态规划)leetcode-300. 最长递增子序列_leetcode-最长递增子序列-动态规划

leetcode-最长递增子序列-动态规划

题目链接:力扣

本题很显然能用动态规划解。设以在数组nums]中,以nums[i]为结尾的最长严格递增子序列长度为p[i],则有以下状态转移方程:

p[0]=1

p[i]=max(p[j]+1),其中0<=j<i<n且nums[i]>nums[j]

即: 对于所有比i小的数j,如果有nums[i]>nums[j],则以nums[j]为结尾的递增子序列再加上i,还是一个递增子序列;在i的所有这样的递增子序列中,找到长度最大的那个,就是以nums[i]为结尾的最长递增子序列。代码如下:

  1. class Solution {
  2. public:
  3. int p[2510]; //结尾为i的最长递增子序列长度(0<=i<n)
  4. void init(vector<int>& nums){
  5. p[0]=1;
  6. for(int i=1;i<nums.size();i++){
  7. int max=1;
  8. for(int j=i-1;j>=0;j--){
  9. if(nums[i]>nums[j] && max<p[j]+1) max=p[j]+1;
  10. }
  11. p[i]=max;
  12. }
  13. }
  14. int lengthOfLIS(vector<int>& nums) {
  15. init(nums);
  16. int max=0;
  17. for(int i=0;i<nums.size();i++){
  18. if(p[i]>max) max=p[i];
  19. }
  20. return max;
  21. }
  22. };

时间复杂度: O(n2)

空间复杂度: O(n)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/680397
推荐阅读
相关标签
  

闽ICP备14008679号