方法:动态规划
1、创建一个数组dp,记录下数组arr不同位置为结尾时的最长上升子序列长度,可以得到如下的状态方程:
如果存在arr[j] (j < i)小于该位置arr[i],通过遍历前序的元素得到:dp[i] = max(dp[i], 1 + dp[j]);
2、遍历完数组arr,数组dp中的最大值即为该数组的最长上升子序列长度。
时间复杂度:o(n2)
空间复杂度:o(n)
class Solution { public: int LIS(vector<int>& arr) { // 特殊情况处理 if (arr.size() == 0) return 0; vector<int> dp(arr.size(), 1); // 初始化为1,只要有元素长度至少为1 int max_len = 1; for (int i = 1; i < arr.size(); i++) { for (int j = 0; j < i; j++) { if (arr[i] > arr[j]) dp[i] = max(dp[i], 1 + dp[j]); } if (dp[i] > max_len) max_len = dp[i]; } return max_len; } };