码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode] 300. Longest Increasing Subsequence (Medium)

时间:2018-11-29 15:04:45      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:长度   leetcode   begin   ==   return   int   seq   class   遍历   

题意:

求最长增长的子序列的长度。

思路:

利用DP存取以i作为最大点的子序列长度。

Runtime: 20 ms, faster than 35.21% of C++ online submissions for Longest Increasing Subsequence.

class Solution
{
public:
  int lengthOfLIS(vector<int> &nums)
  {
    if (nums.size() == 0)
      return 0;
    vector<int> dp(nums.size(), 0);
    dp[0] = 1;
    int resNum = 1;
    for (int i = 1; i < nums.size(); i++)
    {
      int curmaxNum = 0;

      for (int j = 0; j < i; j++)
      {
        if (nums[i] > nums[j])
          curmaxNum = max(dp[j], curmaxNum);
      }
      dp[i] = curmaxNum + 1;
      resNum = max(dp[i], resNum);
    }
    return resNum;
  }
};

解法二:

讨论区里的最优解:

利用一个容器去动态存储一个增长子序列,遍历Nums,对每一个nums[i],在容器中寻找是否有大于等于nums[i]的元素,若存在,则将改值替换为nums[i];

若不存在,则将nums[i]加入该容器,于是容器中的元素永远是 小于 关系的。

0ms.

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> res;
        for(int i=0; i<nums.size(); i++) {
            auto it = std::lower_bound(res.begin(), res.end(), nums[i]);
            if(it==res.end()) res.push_back(nums[i]);
            else *it = nums[i];
        }
        return res.size();
    }
};

 

[leetcode] 300. Longest Increasing Subsequence (Medium)

标签:长度   leetcode   begin   ==   return   int   seq   class   遍历   

原文地址:https://www.cnblogs.com/ruoh3kou/p/10037596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!