【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; } };