300.最长递增子序列

没做过这种子序列类型的问题,直接看解析
动态规划五部曲:
1.dp数组
dp[i]表示以nums[i]为结尾的最长递增子序列的长度
2.递推公式
if nums[i]>nums[j]:
dp[i] = max(dp[i],dp[j]+1)
3.初始化
都是1
4.遍历顺序
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
if not nums:
return 0
dp = [1]*len(nums)
result = 1
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)
result = max(dp[i],result)
#print(dp)
#return max(dp)
return result
这里我们切记不要返回dp[-1]因为最后一个元素存在取不到的情况
674. 最长连续递增序列

动态规划五部曲:
1.dp数组
dp[i]表示以nums[i]为结尾的最长连续递增子序列的长度
2.递推公式
dp[i] = dp[i-1]+1
result记录最大值
3.初始化
全部初始化为1
4.遍历顺序,从前到后
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
if not nums:
return 0
if len(nums)==1:
return 1
dp = [1]*len(nums)
result = -float('inf')
for i in range(1,len(nums)):
if nums[i]>nums[i-1]:
dp[i] = dp[i-1]+1
result = max(result,dp[i])
return result
也可以贪心,我感觉也可以滑动窗口
718. 最长重复子数组

这个题目有两个数组,暴力解法就是遍历两个的起点,然后while比较,记录最大长度,包超时的
直接看解析
动态规划五部曲:
1.dp数组
dp[i][j]:表示以i-1为下标结尾的A和以下标j-1为结尾的B,最长重复子数组长度为dp[i][j]
2.递推公式:
if nums1[i-1] == nums2[j-1]:
dp[i][j] = dp[i-1][j-1]+1
3.dp数组初始化
dp[i][0]和dp[0][j] = 0
4.遍历顺序,先遍历谁其实无所谓
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
dp = [[0]*(len(nums2)+1) for _ in range(len(nums1)+1)]
result = 0
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
result = max(result,dp[i][j])
return result
如果dp[i][j]表示的是,以A[i]和B[j]为结尾的最大相等数组,那么要注意初始化的时候的区别
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
# 创建一个二维数组 dp,用于存储最长公共子数组的长度
dp = [[0] * (len(nums2)) for _ in range(len(nums1))]
# 记录最长公共子数组的长度
result = 0
# 对第一行和第一列进行初始化
for i in range(len(nums1)):
if nums1[i] == nums2[0]:
dp[i][0] = 1
for j in range(len(nums2)):
if nums1[0] == nums2[j]:
dp[0][j] = 1
# 填充dp数组
for i in range(len(nums1)):
for j in range(len(nums2)):
if (nums1[i] == nums2[j]) and i>0 and j>0:
# 如果 nums1[i-1] 和 nums2[j-1] 相等,则当前位置的最长公共子数组长度为左上角位置的值加一
dp[i][j] = dp[i - 1][j - 1] + 1
result = max(result,dp[i][j])
# 返回最长公共子数组的长度
return result
194

被折叠的 条评论
为什么被折叠?



