除了上文外,还可将LIS抽象为最长子序列。
1.此类问题通常可以转化为求最长子串问题(即保持原来的相对次序不变)。
例如最长对链:
Input: [[1,2], [2,3], [3,4]] Output: 2 Explanation: The longest chain is [1,2] -> [3,4]
因为结果链子(s1,e1)->(s2,e2)->...->(sn,e2)一定满足:
s1<s2<s3...<sn
e1<e2<e3<...<en
因此可将原来的pair按照start/end point递增排序。
则最后的结果即为排序后的序列的最长子序列。
2.对于最长子序列问题则可使用上一篇文章中所描述的方法解决。
具体为:从小到大,依次求以第i个序列为结尾的最长子序列的长度。
必可表示为以j个序列为结尾的最长子序列的数值+1
其中j满足以下条件:
j在i的位置前面;
j和i满足所要求的比较关系;
j是满足以上条件的长度最大的数。
代码:
int findLongestChain(vector<vector<int>>& pairs) {
int size = pairs.size();
sort(pairs.begin(), pairs.end(), custom);
int opt[size]; //
for(int i = 0; i < size; i++) opt[i] = 1;
int ans = 0;
for (int i = 1; i < size; i++) {
for (int j = 0; j < i; j++) {
if (pairs[j][1] < pairs[i][0] && (opt[j] + 1) > opt[i])
opt[i] = opt[j] + 1;
}
ans = opt[i] > ans ? opt[i] : ans;
}
return ans;
}