Bootstrap

<代码随想录> 算法训练营-2024.12.25

今日专题:动态规划 子数组/子序列

718. 最长重复子数组
class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        # i-nums1的切片长度  j-nums2的切片长度
        # dp[i][j]表示 在nums1中以到i为止 在nums2中到j为止的相同的子数组长度 nums1[i]=nums2[j]
        # 遍历时记录结果值
        size1 = len(nums1)
        size2 = len(nums2)
        dp = [[0] * size2 for _ in range(size1)]
        res = 0
        for m in range(size1):
            if nums1[m] == nums2[0]:
                dp[m][0] = 1
                res = 1
        for n in range(size2):
            if nums2[n] == nums1[0]:
                dp[0][n] = 1
                res = 1

        for i in range(1, size1):
            for j in range(1, size2):
                if nums1[i] == nums2[j]:
                    dp[i][j] = dp[i - 1][j - 1] + 1
                    res = max(res, dp[i][j])

        return res

674. 最长连续递增序列
class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        #1.不定长滑动窗口 
        res=1
        temp=1
        for i in range(1,len(nums)):
            if nums[i]>nums[i-1]:
                temp+=1
            else:
                temp=1
            res=max(res,temp)
        return res


        
300. 最长递增子序列
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # i-提供的数组长度
        size = len(nums)
        dp = [0] * size
        dp[0] = 1
        for i in range(1, size):
            # 在i-1前面找dp值最大的一个
            temp = 0
            for j in range(i - 1, -1, -1):
                if nums[j] < nums[i]:
                    temp = max(dp[j], temp)

            dp[i] = temp + 1

        return max(dp)

;