问题描述:
Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
问题解决:
维护一个数组a[i],表示数组前i个数的递增子序列的最大长度
a[i]有如下递推式
a[i] = Math.max(a[i], a[j] + 1);
其中j表示数组从第1个数到第i - 1个数,比第i个数小的数的下标。这样从第1个数遍历到第i - 1个数,就可以找到最长的递增子序列
定义一个max,每得到一个a[i]就跟max比较,max取大的
代码如下:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
if(len == 0) return 0;
int max = 1;
vector<int> a(len+1,1);
int i, j;
for(i = 2; i < len+1; i++) {
for(j = 1; j < i; j++) {
//找到比第i个数小的数的下标
if(nums[j-1] < nums[i-1]) {
//比较得到a[i]
a[i] = a[i] > (a[j]+1) ? a[i] : (a[j]+1);
}
}
//max即结果取大的
max = max > a[i] ? max : a[i];
}
return max;
}
};