leetcode-300-线性DP-最长上升子序列 发表于 2020-04-12 | 分类于 数据结构与算法 题目 解法1234567891011121314151617181920212223242526272829303132333435363738// 动态规划,O(n^2)class Solution {public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); if(n == 0) return 0; // dp[i] 表示以第i个数字结尾的最长上升子序列 vector<int> dp(n, 1); for(int i = 0; i < n; ++i) for(int j = 0; j < i; ++j) if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1); return *max_element(dp.begin(), dp.end()); }};// 动态规划 + 二分查找class Solution {public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); int res = 0; // dp[i] 表示每一个最长上升子序列对应末位数字的最小数值 vector<int> dp(n, 0); for(int num : nums){ int i = 0, j = res; while(i < j){ int m = i + (j - i) / 2; if(dp[m] < num) i = m + 1; else j = m; } dp[i] = num; if(res == j) ++res; } return res; }};