程式碼隨想錄演算法訓練營第45天 | 子序列入門

哆啦**發表於2024-07-26

300.最長遞增子序列
https://leetcode.cn/problems/longest-increasing-subsequence/
程式碼隨想錄
https://programmercarl.com/0300.最長上升子序列.html
674.最長連續遞增序列
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/
程式碼隨想錄
https://programmercarl.com/0674.最長連續遞增序列.html#演算法公開課
718.最長重複子陣列
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
程式碼隨想錄
https://programmercarl.com/0718.最長重複子陣列.html#其他語言版本

300.最長遞增子序列

題解

  • dp陣列定義:dp[i]到以nums[i]為結尾的最長遞增子序列的長度;
  • 遞推序列:
    • j遍歷i之前每一個元素:dp[i] = max(dp[j]+1,dp[i])
  • 初始化:
    • dp = [1]*n
  • 遍歷順序
    • i:從小到大遍歷;依賴前面計算過的結果;
    • j:前後都可以;元素完整即可;
點選檢視程式碼
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 1
        if len(nums)==0:
            return 0
        dp = [1]*len(nums)
        res = 0
        for i in range(1,len(nums)):
            for j in range(0,i):
                if nums[j]<nums[i]:
                    dp[i] = max(dp[i],dp[j]+1)
            if dp[i]>res:
                res = dp[i]
        return res

674.最長連續遞增序列

題解

  • dp陣列定義:變成連續遞增的最長遞增子序列
  • 遞推公式變了:只和i-1有關
    • dp[i] = dp[i-1]+1
點選檢視程式碼
class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 1
        if len(nums)==0:
            return 0
        dp = [1]*len(nums)

        res = 0
        for i in range(1,len(nums)):
            if nums[i]>nums[i-1]:
                dp[i] = dp[i-1]+1
            if dp[i]>res:
                res = dp[i]
            # print(dp)
        return res

718. 最長重複子陣列

題解

  • 遞推公式:dp[i][j] = dp[i-1][j-1]+1
    • 不需要比較dp[i-1][j]和dp[i][j-1]
點選檢視程式碼
class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        m = len(nums1)
        n = len(nums2)
        ## dp[i][j] 前i個j個元素中相同的元素有幾個;
        dp = [[0]*(n+1) for _ in range(m+1)]
        ## 不需要專門遍歷某一行 直接從第1行開始就可以
        res = 0
        ## 統一擴大一行
        for i in range(1,m+1):
            for j in range(1,n+1):
                if nums1[i-1]==nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1]+1
                if dp[i][j]>res:
                    res = dp[i][j]
        return res

相關文章