力扣1045.不相交的线【medium】
力扣53.最大子数组和【medium】
力扣392.判断子序列【easy】
一、力扣1045.不相交的线【medium】
题目链接:力扣1045.不相交的线
视频链接:代码随想录
题解链接:灵茶山艾府
1、思路
- 和1143.最长公共子序列一致
- 时间复杂度: O ( m ∗ n ) O(m * n) O(m∗n)
2、代码
class Solution:
def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
m, n = len(nums1), len(nums2)
@cache
def dfs(i:int, j:int) -> int:
if i < 0 or j < 0:
return 0
if nums1[i] == nums2[j]:
return dfs(i - 1, j - 1) + 1
return max(dfs(i - 1, j), dfs(i, j - 1))
return dfs(m - 1, n - 1)
class Solution:
def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
m, n = len(nums1), len(nums2)
f = [[0] * (n + 1) for _ in range(m + 1)]
for i, x in enumerate(nums1):
for j, y in enumerate(nums2):
f[i + 1][j + 1] = f[i][j] + 1 if x == y else max(f[i][j + 1], f[i + 1][j])
return f[m][n]
class Solution:
def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:
m, n = len(nums1), len(nums2)
f = [0] * (n + 1)
for i, x in enumerate(nums1):
pre = 0
for j, y in enumerate(nums2):
tmp = f[j + 1]
f[j + 1] = pre + 1 if x == y else max(f[j + 1], f[j])
pre = tmp #保证 pre 是 f 数组上一行的数据,不是当前行的数据。
return f[n]
二、力扣53.最大子数组和【medium】
题目链接:力扣53.最大子数组和
题解链接:灵茶山艾府
1、思路
-
-
时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# result = float('-inf') # 初始化结果为负无穷大
# count = 0
# for i in range(len(nums)):
# count += nums[i]
# if count >= result:
# result = count
# if count < 0:
# count = 0 # 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
# return result
# ans = -inf
# min_pre_sum = pre_sum = 0
# for x in nums:
# pre_sum += x
# ans = max(ans, pre_sum - min_pre_sum)
# min_pre_sum = min(min_pre_sum, pre_sum)
# return ans
n = len(nums)
f = [0] * n
f[0] = nums[0]
for i in range(1, n):
f[i] = max(f[i - 1], 0) + nums[i]
return max(f)
三、力扣392.判断子序列【easy】
题目链接:力扣392.判断子序列
题解链接:灵茶山艾府
1、思路
- 时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
if len(s) == 0 :
return True
i = 0
for c in t:
if s[i] == c:
i += 1
if i == len(s):
return True
return False