leetcode 300.最长上升子序列
思路:用dp[i]记录当前位置最长的上升子序列长度,每次遍历i之前的数组元素进行比较,如果nums[i] > nums[j],则用变量maxval记录此次遍历最长的上升子序列长度,dp[i] = maxval + 1
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
int ans = 1;
if(len == 0) return 0;
vector<int> dp(len);
dp[0] = 1;
for(int i = 1; i < len; i++)
{
int maxval = 0;
for(int j = 0; j < i; j++)
{
if(nums[i] > nums[j]) maxval = max(maxval, dp[j]);
}
dp[i] = maxval + 1;
ans = max(ans, dp[i]);
}
return ans;
}
};
注:此方法时间复杂度O(n2),leetcode上有用动态规划+二分搜索的方法, 时间复杂度可降低到O(nlogn)。