<代码随想录> 算法训练营-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)