LeetCode 300 最长上升子序列 (LIS问题)O(n^2)普通解法
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
Nums[ ] 数组表示输入的数组
状态定义:lis[ i ] 表示以 i 结尾的上升子序列的最长长度
状态转移:lis[ i ] 的值就是在所有 j 【0 ~i-1】下标中找满足 nums[j] < nums[i] ,在 lis[所有满足的下标 j] 中找最大的值 max,lis[i]的值为 max+1
代码
class Solution {
public:
int lis[114514];
int lengthOfLIS(vector<int>& nums)
{
int len = nums.size();
if(len == 0)
{
return 0;
}
lis[0] = 1;
int mmax = 1;
for(int i=1; i<=len-1; i++)
{
int max = 0;
for(int j=i-1; j>=0; j--)
{
if(nums[j] < nums[i])
{
if(lis[j] > max)
{
max = lis[j];
}
}
}
lis[i] = max + 1;
if(lis[i] > mmax)
{
mmax = lis[i];
}
}
return mmax;
}
};