代码随想录算法训练营Day44

力扣1045.不相交的线【medium】
力扣53.最大子数组和【medium】
力扣392.判断子序列【easy】

一、力扣1045.不相交的线【medium】

题目链接:力扣1045.不相交的线
在这里插入图片描述
视频链接:代码随想录
题解链接:灵茶山艾府

1、思路

  • 和1143.最长公共子序列一致
  • 在这里插入图片描述
  • 时间复杂度: O ( m ∗ n ) O(m * n) O(mn)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值