【leetcode刷題】T165-最長上升子序列

  • 2019 年 10 月 4 日
  • 筆記

木又連續日更第1天(1/100)

木又的第165篇leetcode解題報告

動態規劃類型第10篇解題報告

leetcode第300題:最長上升子序列

https://leetcode-cn.com/problems/longest-increasing-subsequence/

【題目】

給定一個無序的整數數組,找到其中最長上升子序列的長度。

示例:    輸入: [10,9,2,5,3,7,101,18]  輸出: 4  解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。  

說明:

可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。 你演算法的時間複雜度應該為 O(n2) 。

【思路】

這是一道很正常的動態規劃題目:dp[i] = max(dp[j] + 1),這裡的第j個元素需要滿足條件nums[j] < nums[i]

【程式碼】

python版本

class Solution(object):      def lengthOfLIS(self, nums):          """          :type nums: List[int]          :rtype: int          """          if len(nums) < 2:              return len(nums)          dp = [1] * len(nums)          for i in range(1, len(nums)):              for j in range(i-1, -1, -1):                  if nums[i] > nums[j]:                      dp[i] = max(dp[i], dp[j] + 1)          return max(dp)  

C++版本

class Solution {  public:      int lengthOfLIS(vector<int>& nums) {          if(nums.size() < 2)              return nums.size();          vector<int> dp(nums.size(), 1);          int res = 1;          for(int i=1; i<nums.size(); i++){              for(int j=i-1; j >= 0; j--){                  if(nums[i] > nums[j])                      dp[i] = max(dp[i], dp[j] + 1);              }              res = max(res, dp[i]);          }          return res;      }  };  

Tags: