第九章 動態規劃Part10

haohaoscnblogs發表於2024-08-29

目錄
  • 任務
    • 300. 最長遞增子序列
      • 思路
    • 674. 最長連續遞增序列
      • 思路
    • 718. 最長重複子陣列
      • 思路

任務

300. 最長遞增子序列

子序列 是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子序列

思路

dp[i] 表示以索引i結尾的最長嚴格遞增子序列長度,當符合條件時(比之前某個值大),它等於之前某個索引(以j結尾的)達到最長長度加1,不符合條件時(比之前所有值都小),最大長度為1。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        dp = [1] * len(nums)
        result = 1
        for i in range(1,len(nums)):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i],dp[j] + 1)
                result = dp[i] if result < dp[i] else result
        
        return result

674. 最長連續遞增序列

給定一個未經排序的整數陣列,找到最長且 連續遞增的子序列,並返回該序列的長度。
連續遞增的子序列 可以由兩個下標 l 和 r(l < r)確定,如果對於每個 l <= i < r,都有 nums[i] < nums[i + 1] ,那麼子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是連續遞增子序列。

思路

dp[i] 表示以i索引結尾的最長連續遞增序列長度,與上題的區別是需要連續,更簡單了,只需要與dp[i-1]比較即可

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        dp = [1] * len(nums)
        result = 1
        for i in range(1,len(nums)):
                if nums[i] > nums[i-1]:
                    dp[i] = dp[i-1] + 1
                result = dp[i] if result < dp[i] else result
        
        return result

718. 最長重複子陣列

給兩個整數陣列 nums1 和 nums2 ,返回 兩個陣列中 公共的 、長度最長的子陣列的長度 。

思路

dp[i][j]表示 nums1 以i-1結尾,num2 以j-1結尾的最長重複子陣列.這裡的技巧是 表示i-1,j-1結尾,目的是可以避免首行首列的初始化時的麻煩。(如果表示i,j,則首行表示nums1以第一個數結尾的所有重複數字,同理,首列表示num2以第一個數結尾的所有重複數字,如果有則賦1,沒有賦0,遍歷賦值很麻煩) 而i-1,j-1 這樣處理就可以直接全部賦0,不需要考慮上述問題。
當nums1[i-1] == nums2[j-1]時,dp[i][j] = dp[i-1][j-1] + 1,否則,dp[i][j] = 0

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        dp = [[0] * (len(nums2)+1) for _ in range(len(nums1)+1)]
        result = 0
        for i in range(1,len(nums1) + 1):
            for j in range(1,len(nums2) + 1):
                if nums1[i-1] == nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                    result = dp[i][j] if result < dp[i][j] else result
        return result

相關文章