1. 程式人生 > 其它 >最長連續遞增序列

最長連續遞增序列

技術標籤:資料結構和演算法

給定一個未經排序的整數陣列,找到最長且 連續遞增的子序列,並返回該序列的長度。

連續遞增的子序列(嚴格遞增) 可以由兩個下標 l 和 r(l < r)確定,如果對於每個 l <= i < r,都有 nums[i] < nums[i + 1] ,那麼子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是連續遞增子序列。

輸入:nums = [1,3,5,4,7]
輸出:3
解釋:最長連續遞增序列是 [1,3,5], 長度為3。
儘管 [1,3,5,7] 也是升序的子序列, 但它不是連續的,因為 5 和 7 在原數組裡被 4 隔開。

輸入:nums = [2,2,2,2,2]
輸出:1
解釋:最長連續遞增序列是 [2], 長度為1。


為了得到最長連續遞增序列,可以使用貪心的策略得到儘可能長的連續遞增序列。做法是使用當前連續遞增序列的開始下標和結束下標,遍歷陣列的過程中每次比較相鄰元素,根據相鄰元素的大小關係決定是否需要更新連續遞增序列的開始下標。

如果right>right-1, 那說明當前還是滿足遞增的, 計算當前遞增的長度
如果right<=right-1,說明當前不滿足遞增了,right-1可能是本輪遞增的最大值,也可能是下降的過程中;
如果是本輪遞增的最大值,在上面的條件中已經計算過了,無需再次計算;

如果是下降過程中, 更新left的值

繼續迴圈下去, 遍歷結束之後,即可得到整個陣列的最長連續遞增序列的長度。

class Solution {
    func findLengthOfLCIS(_ nums: [Int]) -> Int {

        if nums.count == 0 {
            return 0
        }

        // 遞增序列的左邊
        var left = 0
        // 遞增序列的右邊
        var right = 1
        // 最大長度,最少為1, 因為[2,2,2,2],也認為有一個遞增[2]
        var result = 1

        while right<nums.count {
            // 滿足遞增要求,計算更新下最大長度
            if nums[right] > nums[right-1] {
                result = max(result, right-left+1)
            } else {
                // 不滿足遞增要求了, 更新left值,保證left是遞增的最左邊
                left = right
            }

            right += 1

        }
        return result
    }

}