目錄
- 任務
- 300. 最長遞增子序列
- 思路
- 674. 最長連續遞增序列
- 思路
- 718. 最長重複子陣列
- 思路
- 300. 最長遞增子序列
任務
300. 最長遞增子序列
子序列 是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子序列
思路
dp[i] 表示以索引i結尾的最長嚴格遞增子序列長度,當符合條件時(比之前某個值大),它等於之前某個索引(以j結尾的)達到最長長度加1,不符合條件時(比之前所有值都小),最大長度為1。
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
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 = dp[i] if result < dp[i] else result
return result
674. 最長連續遞增序列
給定一個未經排序的整數陣列,找到最長且 連續遞增的子序列,並返回該序列的長度。
連續遞增的子序列 可以由兩個下標 l 和 r(l < r)確定,如果對於每個 l <= i < r,都有 nums[i] < nums[i + 1] ,那麼子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是連續遞增子序列。
思路
dp[i] 表示以i索引結尾的最長連續遞增序列長度,與上題的區別是需要連續,更簡單了,只需要與dp[i-1]比較即可
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
dp = [1] * len(nums)
result = 1
for i in range(1,len(nums)):
if nums[i] > nums[i-1]:
dp[i] = dp[i-1] + 1
result = dp[i] if result < dp[i] else result
return result
718. 最長重複子陣列
給兩個整數陣列 nums1 和 nums2 ,返回 兩個陣列中 公共的 、長度最長的子陣列的長度 。
思路
dp[i][j]表示 nums1 以i-1結尾,num2 以j-1結尾的最長重複子陣列.這裡的技巧是 表示i-1,j-1結尾,目的是可以避免首行首列的初始化時的麻煩。(如果表示i,j,則首行表示nums1以第一個數結尾的所有重複數字,同理,首列表示num2以第一個數結尾的所有重複數字,如果有則賦1,沒有賦0,遍歷賦值很麻煩) 而i-1,j-1 這樣處理就可以直接全部賦0,不需要考慮上述問題。
當nums1[i-1] == nums2[j-1]時,dp[i][j] = dp[i-1][j-1] + 1,否則,dp[i][j] = 0
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 = dp[i][j] if result < dp[i][j] else result
return result