Day 45 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列

forrestr發表於2024-07-09

300.最長遞增子序列

今天開始正式子序列系列,本題是比較簡單的,感受感受一下子序列題目的思路。
影片講解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.最長上升子序列.html
給你一個整數陣列 nums ,找到其中最長嚴格遞增子序列的長度。
子序列是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子序列。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        #以nums[i]為結尾的最長遞增子序列
        dp = [1] * len(nums)
        for i in range(len(nums)):
            for j in range(i):
                if nums[i]>nums[j]:
                    dp[i] = max(dp[i],dp[j]+1)
        max_l = 0
        for lens in dp:
            max_l = max(lens,max_l)
        return max_l

674. 最長連續遞增序列

本題相對於昨天的動態規劃:300.最長遞增子序列 最大的區別在於“連續”。 先嚐試自己做做,感受一下區別
影片講解:https://www.bilibili.com/video/BV1bD4y1778v
https://programmercarl.com/0674.最長連續遞增序列.html
給定一個未經排序的整數陣列,找到最長且 連續遞增的子序列,並返回該序列的長度。

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        #以nums[i]為結尾的最長連續遞增子序列
        dp = [1]*len(nums)
        for i in range(1,len(nums)):
            if nums[i]>nums[i-1]:
                dp[i]=dp[i-1]+1
        max_l = 0
        for lens in dp:
            max_l = max(max_l,lens)
        return max_l

718. 最長重複子陣列

稍有難度,要使用二維dp陣列了
影片講解:https://www.bilibili.com/video/BV178411H7hV
https://programmercarl.com/0718.最長重複子陣列.html

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

示例:

輸入:

A: [1,2,3,2,1]
B: [3,2,1,4,7]
輸出:3
解釋:長度最長的公共子陣列是 [3, 2, 1] 。

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        # dp[i][j] 以nums1[i]和nums2[j]結尾的公共陣列的長度
        dp = [[0] * len(nums2) for _ in range(len(nums1))]
        for j in range(len(nums2)):
            if nums2[j] == nums1[0]:
                dp[0][j] = 1
        for i in range(len(nums1)):
            if nums1[i] == nums2[0]:
                dp[i][0] = 1        
        for i in range(1,len(nums1)):
            for j in range(1,len(nums2)):
                if nums1[i] == nums2[j]:
                    dp[i][j] = dp[i-1][j-1] + 1
        max_l = 0
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                max_l = max(max_l,dp[i][j])
        return max_l

相關文章