300. Longest Increasing Subsequence
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = [1] * len(nums)
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)
return max(dp)
674. Longest Continuous Increasing Subsequence
dp[i]表示i之前包括i的以nums[i]结尾的最长连续递增子序列的长度
因为要求连续,所以不需要0到i之间的遍历
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
dp = [1] * len(nums)
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
dp[i] = max(dp[i], dp[i - 1] + 1)
return max(dp)
718. Maximum Length of Repeated Subarray
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
# dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]
dp = [[0] * (len(nums2) + 1) for _ in range((len(nums1) + 1))]
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
return max(map(max, dp))
dp[i][j] :以下标 i 为结尾的A,和以下标 j 为结尾的B,最长重复子数组长度为dp[i][j]
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
# dp[i][j] :以下标 i 为结尾的A,和以下标 j 为结尾的B,最长重复子数组长度为dp[i][j]
dp = [[0] * len(nums2) for _ in range(len(nums1))]
# 初始化第一行第一列
for i in range(len(nums1)):
if nums1[i] == nums2[0]:
dp[i][0] = 1
for j in range(len(nums2)):
if nums2[j] == nums1[0]:
dp[0][j] = 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
return max(map(max, dp))