Leetcode 300. Longest Increasing Subsequence

文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書

1. Description

Longest Increasing Subsequence

2. Solution

解析:Version 1,最長遞增子序列,典型的動態(tài)規(guī)劃問題,定義狀態(tài):以nums[i]作為結(jié)尾元素的最長遞增子序列的長度,狀態(tài)轉(zhuǎn)移方程:遍歷nums[i]之前的元素nums[j],如果nums[i] > nums[j],則其最長遞增子序列的長度為max(dp[i], dp[j] + 1),遍歷之后,可以找到以nums[i]作為結(jié)尾元素的最長遞增子序列長度,最終返回的是所有元素的最長遞增子序列長度中最長的一個。Version 2是一種技巧,使用order作為有序序列保持最長遞增子序列長度,當新元素比有序序列的最后一個元素大時,此時增加新元素到有序序列中,否則,則將新元素插入到當前序列中,替換比其大或相等的元素,保證左側(cè)元素都比它小,此時長度不變,order中始終保留較小的元素,這樣利于插入新元素。order的長度等于最長遞增子序列長度,但order的數(shù)據(jù)不一定等于最長遞增子序列的數(shù)據(jù)。

  • Version 1
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [1] * n
        for i in range(1, n):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)
  • Version 2
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        order = []
        for i in range(n):
            if len(order) == 0 or order[-1] < nums[i]:
                order.append(nums[i])
            else:
                index = bisect.bisect_left(order, nums[i])
                order[index] = nums[i]
        return len(order)

Reference

  1. https://leetcode.com/problems/longest-increasing-subsequence/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容