当前位置: 首页 > backend >正文

代码随想录算法训练营Day43

力扣300.最长递增子序列
力扣674.最长连续递增子序列【easy】
力扣1143.最长公共子序列【medium】
力扣718.最长重复子数组【medium】

一、力扣300.最长递增子序列【medium】

题目链接:力扣300.最长递增子序列
在这里插入图片描述

视频链接:代码随想录
题解链接:灵茶山艾府

1、思路

  • 构造选 n u m s [ i ] nums[i] nums[i] 为子列的末尾元素,再遍历[1,i) ,选出 n u m s [ j ] < n u m s [ i ] nums[j] < nums[i] nums[j]<nums[i]
  • d f s ( i ) dfs(i) dfs(i):表示以 n u m s [ i ] nums[i] nums[i] 结尾的LIS长度

2、代码

1)记忆化搜索
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:@cachedef dfs(i:int) -> int:res = 0for j in range(i):if nums[j] < nums[i]:res = max(res, dfs(j))return res + 1return max(dfs(i) for i in range(len(nums))) 
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)f = [0] * n for i, x in enumerate(nums):for j, y in enumerate(nums[: i]):if y < x:f[i] = max(f[i], f[j])f[i] += 1return max(f)
  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),二分法是 l o g n logn logn
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:g = []for x in nums:j = bisect_left(g, x)if j == len(g):g.append(x)else:g[j] = xreturn len(g)

3、代码问题

在这里插入图片描述
在这里插入图片描述


二、力扣674.最长连续递增子序列【easy】

题目链接:力扣最长连续递增子序列
在这里插入图片描述
视频链接:代码随想录

1、思路

  • 这题是连续!
  • 可以用贪心更简单!!
  • 时间复杂度: O ( n ) O(n) O(n)

2、代码

1)贪心
class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n = len(nums)ans = 1count = 1for i in range(1, n):if nums[i - 1] <nums[i]:count += 1ans = max(count, ans)else:count = 1return ans
2)dp:动态规划
class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n = len(nums)ans = 1f = [1] * n for i in range(1, n):if nums[i - 1] < nums[i]:f[i] = f[i - 1] + 1ans = max(f[i], ans)return ans

三、力扣1143.最长公共子序列【medium】

题目链接:力扣1143.最长公共子序列
在这里插入图片描述
视频链接:代码随想录
题解链接:灵茶山艾府

1、思路

  • 时间复杂度: O ( n m ) O(nm) O(nm)

2、代码

1)记忆化搜索
class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n = len(text1), len(text2)@cachedef dfs(i:int, j:int) -> int:if i < 0 or j < 0 :return 0if text1[i] == text2[j] :return dfs(i - 1, j - 1) + 1else:return max(dfs(i - 1, j), dfs(i, j - 1))return dfs(m - 1, n - 1)
2)dp
class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n = len(text1), len(text2)f = [[0] * (n + 1) for _ in range(m + 1)]for i, x in enumerate(text1):for j, y in enumerate(text2):f[i + 1][j + 1] = f[i][j] + 1 if x == y else max(f[i + 1][j], f[i][j + 1])return f[m][n]
3)空间优化:一个数组
class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n = len(text1), len(text2)f = [0] * (n + 1) for x in text1:pre = 0for j, y in enumerate(text2):tmp = f[j + 1]f[j + 1] = pre + 1 if x == y else max(f[j], f[j + 1])pre = tmp #保证 pre 是 f 数组上一行的数据,不是当前行的数据。return f[n]

四、力扣718.最长重复子数组【medium】

题目链接:力扣
left =x300
视频链接:代码随想录

1、思路

  • 时间复杂度: O ( m ∗ n ) O(m * n) O(mn)

2、代码

1)记忆化搜索
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:m, n = len(nums1), len(nums2)ans = 0@cachedef dfs(i:int, j:int) -> int:if i < 0 or j < 0:return 0if nums1[i] == nums2[j]:count = dfs(i - 1, j - 1) + 1else:count = 0nonlocal ansans = max(count, ans)return countfor i in range(m):for j in range(n):dfs(i, j)return ans
2)dp
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:m, n = len(nums1), len(nums2)ans = 0f = [[0] * (n + 1) for _ in range(m + 1)]for i, x in enumerate(nums1):for j, y in enumerate(nums2):# 当前字符相等时,继承左上方值 +1,否则重置为 0if x == y:f[i + 1][j + 1] = f[i][j] + 1ans = max(f[i + 1][j + 1], ans)else:f[i + 1][j + 1] = 0 # 不连续时直接置零return ans
3)空间优化:一个数组
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:m, n = len(nums1), len(nums2)ans = 0f = [0] * (n + 1) for i, x in enumerate(nums1):pre = 0for j, y in enumerate(nums2):tmp = f[j + 1]# 当前字符相等时,继承左上方值 +1,否则重置为 0if x == y:f[j + 1] = pre + 1ans = max(f[j + 1], ans)else:f[j + 1] = 0 # 不连续时直接置零pre = tmpreturn ans

http://www.xdnf.cn/news/3690.html

相关文章:

  • 超预期!淘宝闪购提前开放全国全量,联合饿了么扭转外卖战局
  • 美丽天天秒链动2+1源码(新零售商城搭建)
  • P4314 CPU 监控 Solution
  • YOLO旋转目标检测之ONNX模型推理
  • 上位机知识篇---粗细颗粒度
  • P2415集合求和 题解
  • 【Java IO流】字符输入流FileReader、字符输出流FileWriter
  • C++ 动态内存管理详讲
  • 【Java IO流】字节输入流FileInputStream、字节输出流FileOutputStream
  • ICRA 2025 基于触觉反馈的闭环分层控制框架——开放环境下通用门开启的智能规划与操作
  • 【unity游戏开发入门到精通——UGUI】实现精准点击异形或者不规则图片button按钮
  • 字符串的相关方法
  • 【黑马JavaWeb+AI知识梳理】后端Web基础02 - Web基础
  • 街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)20
  • Winform(8.常用控件1)
  • 电商平台的订单状态设计流程
  • QT中的QSS---界面美化
  • 时间给了我们什么?
  • 本地服务验证-仙盟创梦IDE-智能编程,编程自动备份+编程审计
  • C++开发指南
  • MyBatis 参数处理全解析
  • AI大模型-RAG到底能做些什么?
  • 变色龙-第16届蓝桥第5次STEMA测评Scratch真题第1题
  • 52、【OS】【Nuttx】【OSTest】setvbuf 测试
  • 正态分布全景解析:理论、推导与应用
  • Linux-sysctl工具解析
  • 《AI大模型应知应会100篇》第44篇:大模型API调用最佳实践(附完整代码模板)
  • GC9D01 和 GC9A01两种TFT 液晶显示驱动芯片
  • Set的局限性
  • C#将Mat或Byte快速转换为Bitmap格式