news 2026/8/14 16:23:59

动态规划专练:力扣第1035、392题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划专练:力扣第1035、392题

力扣第1035题-不相交的线

1.本题和力扣第1143题-最长公共子序列一模一样,不能让线相交本质上就是不能走回头路,相对顺序不能改变,即公共子序列需要按顺序排列。完整代码如下:

1. int maxUncrossedLines(int* nums1, int nums1Size, int* nums2, int nums2Size) { 2. // 一维滚动dp数组,dp[j]表示nums1前i个数字、nums2前j个数字能绘制的最多不相交连线 3. int dp[nums2Size + 1]; 4. memset(dp, 0, sizeof(dp)); 5. 6. for (int i = 1; i <= nums1Size; i++){ 7. // pre存储二维dp[i-1][j-1]的值,即本轮更新前的dp[j-1] 8. int pre = dp[0]; 9. for (int j = 1; j <= nums2Size; j++){ 10. // 保存更新前dp[j],作为下一轮j+1的pre 11. int cur = dp[j]; 12. if (nums1[i - 1] == nums2[j - 1]){ 13. // 数字相等,可以连线,数量等于左上角状态+1 14. dp[j] = pre + 1; 15. } else { 16. // 数字不等,继承上方或左侧更大的连线数 17. dp[j] = fmax(dp[j], dp[j - 1]); 18. } 19. pre = cur; 20. } 21. } 22. 23. return dp[nums2Size]; 24. }

该算法时间复杂度为O(nums1Size * nums2Size),空间复杂度为O(nums2Size)。

力扣第392题-判断子序列

1.可以使用双指针,t的指针cur2一直+1,s的指针cur1只有在两个指针所指字符相等的时候才+1,最后如果cur1 == len1就说明s是t的子集,否则就不是。完整代码如下:

1. bool isSubsequence(char* s, char* t) { 2. int len1 = strlen(s); 3. int len2 = strlen(t); 4. // s长度大于t,不可能是子序列 5. if (len1 > len2) return false; 6. 7. // cur1:s匹配指针,cur2:t遍历指针 8. int cur1 = 0, cur2 = 0; 9. while (cur1 < len1 && cur2 < len2){ 10. // 字符匹配,s指针后移 11. if (s[cur1] == t[cur2]){ 12. cur1++; 13. } 14. // t指针持续后移 15. cur2++; 16. } 17. 18. // s全部匹配完成则为子序列 19. if (cur1 == len1) return true; 20. return false; 21. }

该算法时间复杂度为O(m + n),空间复杂度为O(1)(m和n为字符串s和t的长度)。

2.本题也可以使用动态规划,本质上和力扣第1143题-最长公共子序列一模一样,只不过字符串s一定不会删除字符。最后只需要判断dp[len2]是否等于len1即可判断是否全部匹配。完整代码如下:

1. bool isSubsequence(char* s, char* t) { 2. int len1 = strlen(s); 3. int len2 = strlen(t); 4. // s更长一定不可能是子序列,直接返回false 5. if (len1 > len2) return false; 6. 7. // 一维滚动dp数组,dp[j]代表s前i个字符、t前j个字符的最长公共子序列长度 8. int dp[len2 + 1]; 9. memset(dp, 0, sizeof(dp)); 10. for (int i = 1; i <= len1; i++){ 11. // pre保存二维dp[i-1][j-1],更新前左上角的值 12. int pre = dp[0]; 13. for (int j = 1; j <= len2; j++){ 14. // 记录更新前dp[j],作为下一轮j+1的pre 15. int cur = dp[j]; 16. if (s[i - 1] == t[j - 1]){ 17. // 字符匹配,公共子序列长度 = 左上角值 + 1 18. dp[j] = pre + 1; 19. } else { 20. // 字符不匹配,取上方旧值或左侧新值较大者 21. dp[j] = fmax(dp[j], dp[j - 1]); 22. } 23. pre = cur; 24. } 25. } 26. // 若最长公共子序列长度等于s全长,说明s是t的子序列 27. return dp[len2] == len1; 28. }

该算法时间复杂度为O(m * n),空间复杂度为O(n)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 16:23:20

十大最佳 AI 编码工具

目录 最佳的​​AI编码工具有哪些&#xff1f; IDEs 1. Cursor 2. GitHub Copilot 3. Codeium 对话式人工智能 4. Claude 5. ChatGPT 6. DeepSeek 7. Perplexity AI 8. Grok 9. Bolt.new 10. v0 作者&#xff1a;Vercel 测试免费的AI编程工具 Bolt.New v0 结论…

作者头像 李华
网站建设 2026/8/14 16:21:56

混合办公两难:视频会议私有化部署频频失守的真相

混合办公两难&#xff1a;视频会议为何在私有化部署上频频失守 疫情之后的混合办公常态化&#xff0c;正在把视频会议系统推向一个此前从未面对过的两难境地&#xff1a;既要保障总部内网的稳定与安全&#xff0c;又要让分布在各处的居家办公、分支机构和移动端员工顺畅接入。这…

作者头像 李华
网站建设 2026/8/14 16:21:15

第一次让 AI 帮你写代码:用 JavaScript 完成一个待办事项清单

文章目录一、先明确我们要做什么二、先让 AI 拆解需求三、再让 AI 生成代码四、完整可运行代码五、如何运行这段代码六、如何验证 AI 生成的代码七、AI 生成代码时常见的问题1. 代码看起来完整&#xff0c;但无法运行2. 只实现了正常情况3. 代码能运行&#xff0c;但自己看不懂…

作者头像 李华
网站建设 2026/8/14 16:21:11

C语言基础:操作符详解(一)

目录 一、操作符的分类 二、二进制和进制转换 但我们该怎么完成常用进制之间的进制转换呢&#xff1f; 如何完成十进制到二进制 ​编辑如何完成二进制转到八进制 如何完成二进制转到十六进制 如何完成其他进制的转换 前言 C语言中提供了非常丰富的操作符 一、操作符的…

作者头像 李华
网站建设 2026/8/14 16:20:28

中级开发者用 AI,最容易掉进的 5 个坑

文章目录开篇一、为什么中级开发者更容易踩坑二、这 5 个坑的共同问题是什么三、中级开发者最容易掉进的 5 个坑1. 需求只说一句话&#xff0c;就让 AI 直接写代码2. 不提供项目上下文&#xff0c;却期待 AI 写出可直接合并的代码3. 看到 AI 代码能运行&#xff0c;就跳过审查和…

作者头像 李华
网站建设 2026/8/14 16:11:50

从Cursor到多智能体:2026年AI全栈开发工具到底该怎么选?

以前说自己是全栈&#xff0c;意思是得懂点产品&#xff0c;能切图&#xff0c;前端Vue后端Node都能写&#xff0c;顺便还得懂点服务器部署。现在说全栈&#xff0c;我觉得更像是怎么调度不同脾气的AI。 过去这大半年&#xff0c;市面上叫得出名字的AI开发工具我都摸了一遍。很…

作者头像 李华