方法:动态规划
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;
}
};

京公网安备 11010502036488号