题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

算法思想:题目要求最长的上升序列,需要设置一个dp[]数组,用来记录最终的结果长度,dp[i]表示包含的序列最后一个元素是nums[i]的长度。dp[i]取值只有两种情况,第一种情况:当前面的元素都没有当前nums[i]元素值小,则dp[i]=1,即只包含自身元素,长度就是1。第二种情况:当前面存在比nums[i]小的元素,就将当前nums[i]添加到比nums[i]小的元素后面,dp[i]=dp[i]+1。
具体做法:初始化dp数组,dp[i]=1,ans=-1用于返回最大递增长度,当nums[i]>nums[j]时,并且dp[i]<dp[j]+1时,就更新dp[i]=dp[j]+1,计算出一个dp[i],就更新一下ans,ans=max(ans,dp[i]),最终ans就是最大递增子序列长度
i

代码实现:

class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int length=nums.size();
if(length==0)
return 0;
int dp[length];
for(int i=0;i<length;i++){
dp[i]=1;//边界
}
int ans=-1;
for(int i=0;i<length;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]&&(dp[i]<dp[j]+1)){
dp[i]=dp[j]+1;
}
}
ans=max(ans,dp[i]);
}
return ans;
}
};