最長上升連續子序列(LintCode)
阿新 • • 發佈:2018-12-24
題目來源:LintCode
原題地址:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence/
題目:
最長上升連續子序列
容易 思路分析:
根據題目中的意思,很明顯,我們需要計算正向序列和反向序列的最長上升連續子序列。 由於題目中限定是連續的,因此我們只要考慮相鄰的兩個數是否滿足條件的就可以了。
例如對於正向序列來說,只需要判斷前一個數是否小於後一個數就可以了。設定一個臨時變數,滿足條件則+1,不滿足則重置為1。
需要說明的是,這裡題目中沒有提到兩個數等於的情況,因此我在實現過程中並未考慮有重複數字的情況。
如果有要求需要滿足重複數字的情況,只需要將大於號(>)改為大於等於號(>=)就可以了
實現程式碼:
程式碼說明:
在實現的過程中,正向和逆向是分開來計算的。
但是這二者的最大值是統一的,因此實現過程中maxSubLen並未重置。而tempLen這個變數是用來儲存臨時的最長上升連續子序列的長度值,因此在計算逆向的時候,需要重置為1。
給定一個整數陣列(下標從 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。