题目:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例一:
输入:nums = [10,9,2,5,3,7,101,18] 输出:4
示例二:
输入:nums = [0,1,0,3,2,3] 输出:4
示例三:
输入:nums = [7,7,7,7,7,7,7] 输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
思路:
本题我们可以使用动态规划中的dp数组来完成,首先我们要考虑的问题是dp数组的含义是什么。
这道题的dp数组的含义就是到达下标为i的最长递增子序列的长度。
然后可以通过下面这段代码来一步步实现计算出每一个位置的最长递增子序列
if(nums[j] < nums[i]){
dp[i] = max(dp[i], dp[j] + 1);//看看是否当前最长子序列比之前排出来的最长子序列要小
}
其中使用了max函数的原因是为了判断是否当前的最长子序列比之前已经计算出的最长递增子序列要小,若比其小,就还是按照之前的进行下一步计算,反之按照现在算出的结果去进行下一步。
代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//dp[i]表示的是到达下标为i的最长递增子序列有多长
vector<int> dp(nums.size(), 1);
if(nums.size() == 1){
return nums.size();
}
int ans = 0;
for(int i = 1; i < nums.size(); i++){
for(int j = i - 1; j >= 0; j--){
if(nums[j] < nums[i]){
dp[i] = max(dp[i], dp[j] + 1);//看看是否当前最长子序列比之前排出来的最长子序列要小
}
if(ans < dp[i]){
ans = dp[i];
}
}
}
return ans;
}
};
时间复杂度:O()
n为nums数组的长度
空间复杂度:O(n)
额外使用了长度为n的dp数组