300.最長遞增子序列
https://leetcode.cn/problems/longest-increasing-subsequence/
程式碼隨想錄
https://programmercarl.com/0300.最長上升子序列.html
674.最長連續遞增序列
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/
程式碼隨想錄
https://programmercarl.com/0674.最長連續遞增序列.html#演算法公開課
718.最長重複子陣列
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
程式碼隨想錄
https://programmercarl.com/0718.最長重複子陣列.html#其他語言版本
300.最長遞增子序列
題解
- dp陣列定義:dp[i]到以nums[i]為結尾的最長遞增子序列的長度;
- 遞推序列:
- j遍歷i之前每一個元素:dp[i] = max(dp[j]+1,dp[i])
- 初始化:
- dp = [1]*n
- 遍歷順序
- i:從小到大遍歷;依賴前面計算過的結果;
- j:前後都可以;元素完整即可;
點選檢視程式碼
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
if len(nums)==1:
return 1
if len(nums)==0:
return 0
dp = [1]*len(nums)
res = 0
for i in range(1,len(nums)):
for j in range(0,i):
if nums[j]<nums[i]:
dp[i] = max(dp[i],dp[j]+1)
if dp[i]>res:
res = dp[i]
return res
674.最長連續遞增序列
題解
- dp陣列定義:變成連續遞增的最長遞增子序列
- 遞推公式變了:只和i-1有關
- dp[i] = dp[i-1]+1
點選檢視程式碼
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
if len(nums)==1:
return 1
if len(nums)==0:
return 0
dp = [1]*len(nums)
res = 0
for i in range(1,len(nums)):
if nums[i]>nums[i-1]:
dp[i] = dp[i-1]+1
if dp[i]>res:
res = dp[i]
# print(dp)
return res
718. 最長重複子陣列
題解
- 遞推公式:dp[i][j] = dp[i-1][j-1]+1
- 不需要比較dp[i-1][j]和dp[i][j-1]
點選檢視程式碼
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
m = len(nums1)
n = len(nums2)
## dp[i][j] 前i個j個元素中相同的元素有幾個;
dp = [[0]*(n+1) for _ in range(m+1)]
## 不需要專門遍歷某一行 直接從第1行開始就可以
res = 0
## 統一擴大一行
for i in range(1,m+1):
for j in range(1,n+1):
if nums1[i-1]==nums2[j-1]:
dp[i][j] = dp[i-1][j-1]+1
if dp[i][j]>res:
res = dp[i][j]
return res