1. 程式人生 > >[leetcode] 300. Longest Increasing Subsequence (Medium)

[leetcode] 300. Longest Increasing Subsequence (Medium)

題意:

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

思路:

利用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(); } };