LintCode 397: Longest Increasing Continuous Subsequence
题目描述
给定一个整数数组(下标从0
到n - 1
,n
表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)
样例
给定[5, 4, 2, 1, 3]
, 其最长上升连续子序列(LICS)为[5, 4, 2, 1]
, 返回4
.
给定[5, 1, 2, 3, 4]
, 其最长上升连续子序列(LICS)为[1, 2, 3, 4]
, 返回4
.
Thu Feb 23 2017
思路
数组的题目一般会用指针扫描遍历,时间复杂度为\(O(n)\),大多数题目都是这样的套路。
先假设只求单调上升序列,只需要从第一个数字开始向后扫描,遇到更大的数计数器就加一,否则就重新计数。
若是需要同时考虑单调上升和单调下降的话,只需要将判断条件改为当前一对数与前面一对数的单调关系是否相同就行了。
还有一些小细节需要注意,比如若是数组长度小于等于2,则直接返回数组长度。
遇到单调性不一致的数,计数器不是直接归零,而是变为2,因为当前数字与前一个数字肯定是单调上升或单调下降的。
代码
// 最长上升连续子序列
int longestIncreasingContinuousSubsequence(vector<int>& A)
{
if (A.size() <= 2) return A.size();
int now = 2, ans = 2;
for (int i = 2; i < A.size(); ++i)
{
if ((A[i] < A[i - 1]) == (A[i - 1] < A[i - 2]))
ans = ++now > ans ? now : ans;
else
now = 2;
}
return ans;
}