300.最長遞增子序列
今天開始正式子序列系列,本題是比較簡單的,感受感受一下子序列題目的思路。
影片講解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.最長上升子序列.html
給你一個整數陣列 nums ,找到其中最長嚴格遞增子序列的長度。
子序列是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子序列。
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#以nums[i]為結尾的最長遞增子序列
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[i]>nums[j]:
dp[i] = max(dp[i],dp[j]+1)
max_l = 0
for lens in dp:
max_l = max(lens,max_l)
return max_l
674. 最長連續遞增序列
本題相對於昨天的動態規劃:300.最長遞增子序列 最大的區別在於“連續”。 先嚐試自己做做,感受一下區別
影片講解:https://www.bilibili.com/video/BV1bD4y1778v
https://programmercarl.com/0674.最長連續遞增序列.html
給定一個未經排序的整數陣列,找到最長且 連續遞增的子序列,並返回該序列的長度。
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
#以nums[i]為結尾的最長連續遞增子序列
dp = [1]*len(nums)
for i in range(1,len(nums)):
if nums[i]>nums[i-1]:
dp[i]=dp[i-1]+1
max_l = 0
for lens in dp:
max_l = max(max_l,lens)
return max_l
718. 最長重複子陣列
稍有難度,要使用二維dp陣列了
影片講解:https://www.bilibili.com/video/BV178411H7hV
https://programmercarl.com/0718.最長重複子陣列.html
給兩個整數陣列 A 和 B ,返回兩個陣列中公共的、長度最長的子陣列的長度。
示例:
輸入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
輸出:3
解釋:長度最長的公共子陣列是 [3, 2, 1] 。
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
# dp[i][j] 以nums1[i]和nums2[j]結尾的公共陣列的長度
dp = [[0] * len(nums2) for _ in range(len(nums1))]
for j in range(len(nums2)):
if nums2[j] == nums1[0]:
dp[0][j] = 1
for i in range(len(nums1)):
if nums1[i] == nums2[0]:
dp[i][0] = 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
max_l = 0
for i in range(len(nums1)):
for j in range(len(nums2)):
max_l = max(max_l,dp[i][j])
return max_l