题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence/
题目:
最长上升连续子序列
给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)
您在真实的面试中是否遇到过这个题?
Yes
样例
给定 [5, 4, 2, 1, 3]
, 其最长上升连续子序列(LICS)为 [5, 4, 2, 1]
, 返回 4
.
给定
[5, 1, 2, 3, 4]
, 其最长上升连续子序列(LICS)为
[1, 2, 3, 4]
, 返回
4
.
难度级别:
容易
容易
思路分析:
根据题目中的意思,很明显,我们需要计算正向序列和反向序列的最长上升连续子序列。
根据题目中的意思,很明显,我们需要计算正向序列和反向序列的最长上升连续子序列。
由于题目中限定是连续的,因此我们只要考虑相邻的两个数是否满足条件的就可以了。
例如对于正向序列来说,只需要判断前一个数是否小于后一个数就可以了。设定一个临时变量,满足条件则+1,不满足则重置为1。
需要说明的是,这里题目中没有提到两个数等于的情况,因此我在实现过程中并未考虑有重复数字的情况。
如果有要求需要满足重复数字的情况,只需要将大于号(>)改为大于等于号(>=)就可以了
例如对于正向序列来说,只需要判断前一个数是否小于后一个数就可以了。设定一个临时变量,满足条件则+1,不满足则重置为1。
需要说明的是,这里题目中没有提到两个数等于的情况,因此我在实现过程中并未考虑有重复数字的情况。
如果有要求需要满足重复数字的情况,只需要将大于号(>)改为大于等于号(>=)就可以了
实现代码:
class Solution
{
public:
/**
* @param A an array of Integer
* @return an integer
*/
int longestIncreasingContinuousSubsequence(vector<int>& A)
{
if (A.empty())
{
return 0;
} else if (A.size() == 1)
{
return 1;
}
int maxSubLen = 0;
int tempLen = 1;
for (int i = 1; i < A.size(); i++)
{
if (A[i] > A[i - 1])
{
tempLen++;
} else
{
tempLen = 1;
}
if (maxSubLen < tempLen)
{
maxSubLen = tempLen;
}
}
tempLen = 1;
for (int i = A.size()-1; i >= 1; --i)
{
if (A[i] < A[i - 1])
{
tempLen++;
} else
{
tempLen = 1;
}
if (maxSubLen < tempLen)
{
maxSubLen = tempLen;
}
}
return maxSubLen;
}
};
代码说明:
在实现的过程中,正向和逆向是分开来计算的。
但是这二者的最大值是统一的,因此实现过程中maxSubLen并未重置。而tempLen这个变量是用来保存临时的最长上升连续子序列的长度值,因此在计算逆向的时候,需要重置为1。
在实现的过程中,正向和逆向是分开来计算的。
但是这二者的最大值是统一的,因此实现过程中maxSubLen并未重置。而tempLen这个变量是用来保存临时的最长上升连续子序列的长度值,因此在计算逆向的时候,需要重置为1。