1. 程式人生 > >最長上升連續子序列(LintCode)

最長上升連續子序列(LintCode)

題目來源: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。
需要說明的是,這裡題目中沒有提到兩個數等於的情況,因此我在實現過程中並未考慮有重複數字的情況。
如果有要求需要滿足重複數字的情況,只需要將大於號(>)改為大於等於號(>=)就可以了
實現程式碼:
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。