代码随想录刷题|LeetCode 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

news2024/12/23 23:07:52

目录

1143.最长公共子序列

思路

1、确定dp数组

2、确定递推公式

3、dp数组初始化

4、遍历顺序

5、推导dp数组

最长公共子序列 

1035.不相交的线

思路

不相交的线

53. 最大子序和

思路

最大子序列

动态规划

贪心算法


1143.最长公共子序列

题目链接:力扣

思路

        不知道为什么,子序列问题的动态规划感觉比 背包问题 和 买卖股票问题 这两类题目难理解很多,比较了以下,可能是因为之前的数组,横列数列代表的都是不同的东西,而序列问题横列和数列代表的都是字符串本身,可能是这个原因吧,还不太清楚

        可以看一下这个视频的图表推导:对照着代码更容易理解:最长公共子序列

1、确定dp数组

dp[i][j]:长度为[0, i]的字符串text1与长度为[0, j]的字符串text2的最长公共子序列为dp[i][j]

2、确定递推公式

两种情况:

  • text1[ i ] 与 text2[ j ]相同
    • 那就是找到了一个公共元素,所以:dp[ i ][ j ] = dp[i - 1][j - 1] + 1;

       
  • text1[ i ] 与 text2[ j ]不相同
    • 那就要看看长度为[0, i - 1]的text1与长度为[0 , i]的text2 的最长公共子序列
                    与长度为[0, i ]的text1与长度为[0 , i - 1]的text2 的最长公共子序列
                     这两个哪个最大,取最大的


      所以:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 
  • 最终的代码就为
    if (text1[i - 1] == text2[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
    } else {
        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
    }

3、dp数组初始化

dp[i][0] 表示:长度为[0, i ]的text1 与 空串的最长公共子序列,那肯定是 0 ,所以dp[i][0] = 0;

同理:dp[0][j] = 0

其他的会根据上面的一列一行,计算覆盖,所以赋值什么都可以的,所以统一默认为0 就行

4、遍历顺序

从前向后遍历

5、推导dp数组

        dp数组的 行和列 是比两个字符串的长度多1的,这是一个面对代码不太好理解的点

        所以在遍历字符串的时候都是从1开始,求的第一个其实就是 dp[1][1] ,但是此时是根据初始化的那部分来求的,此时是字符串以下标的 0 和 0 结尾的字符串,但是是dp数组的[1][1]

最长公共子序列 

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        
        // 创建dp数组
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];

        // 初始化dp数组
        // 默认就是初始化

        // 推导dp数组
        for (int i = 1; i <= text1.length(); i++) {
            char chi = text1.charAt(i - 1);
            for (int j = 1; j <= text2.length(); j++) {
                char chj = text2.charAt(j - 1);
                if (chi == chj) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }

        return dp[text1.length()][text2.length()];
    }
}

1035.不相交的线

题目链接:力扣

思路

        这道题目是求不相交的线,其实就是求两个数组的最长公共子序列,这样就跟上一道题目一样了,一模一样的代码,就是把字符串换成了数组

不相交的线

class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {

        // 创建dp数组
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];

        // 初始化dp数组

        // 推导dp数组
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = 1; j <= nums2.length; j++) {
                if (nums1[i-1] == nums2[j-1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }

        return dp[nums1.length][nums2.length];
    }
}

53. 最大子序和

题目链接:力扣

思路

        看起来简单,自己写了一下,还是有不少细节的,只要是初始化和result的赋值 ,如果摸不准就在推导完dp数组后在选取最大值

1、确定dp数组的含义

dp[i]:包括下标i之前的最大连续子序列和为dp[i]

2、确定递推公式

做过贪心算法的方法就很容易理解,有两种情况

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和

3、初始化

从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。

dp[0]应为nums[0]即dp[0] = nums[0]

4、遍历顺序

从前向后进行遍历

最大子序列

动态规划

// 在推导dp数组的过程中获取最大值
class Solution {
    public int maxSubArray(int[] nums) {

        // 创建dp数组
        int[] dp = new int[nums.length];

        // 初始化dp数组
        dp[0] = nums[0];

        // 推导dp数组
        // 获取结果
        int result = nums[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(nums[i],dp[i - 1] + nums[i]);
            if (dp[i] > result) {
                result = dp[i];
            }
        }
        return  result;
    }
}

// 推导完dp数组后再获取最大值
class Solution {
    public int maxSubArray(int[] nums) {

        // 创建dp数组
        int[] dp = new int[nums.length];

        // 初始化dp数组
        dp[0] = nums[0];

        // 推导dp数组
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(nums[i],dp[i - 1] + nums[i]);
        }
        
        // 获取结果
        int result = Integer.MIN_VALUE;
        for (int num : dp) {
            result = num > result ? num : result;
        }
        return result;
    }
}

贪心算法

class Solution {
    public int maxSubArray(int[] nums) {

        int result = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            count += nums[i];
            if (count > result) {
                result = count;
            }
            if (count < 0) {
                count = 0;
            }
        
        }
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你在终端启动的进程,最后都是什么下场?(下)

你在终端启动的进程&#xff0c;最后都是什么下场&#xff1f;&#xff08;下&#xff09; 在上期文章你在终端启动的进程&#xff0c;最后都是什么下场&#xff1f;&#xff08;上&#xff09;当中我们介绍了前台进程最终结束的几种情况&#xff0c;在本篇文章当中主要给大家…

好书分享丨区块链的骨骼——密码技术

开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 180篇原创内容 …

darknet框架GPU编译安装

Darknet: Open Source Neural Networks in C 1、darknet下载 git clone https://github.com/pjreddie/darknet.git cd darknet设置makefile gpu1 cudnn1 opencv1【1】GPU1;需要设置显卡驱动、cuda 使用nvidia-smi 查看显卡型号和支持的cuda版本号 nvidia官网下载cuda,以及…

计算机网络学习笔记(Ⅱ):物理层

目录 1 物理层概念 1.1 物理层基本概念 1.定义 2.主要任务 3.特性 1.2 数据通信基础 1.典型模型 2.相关术语 3.三种通信方式 4.数据传输方式 1.3 物理层内容 1.码元 2.速率 3.带宽 1.4 奈氏准则与香农定理 1.失真 2.码间串扰 3.奈氏准则 4.香农定理 1.5 …

蓝桥杯C/C++VIP试题每日一练之Huffman树

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

基于JSP的某餐厅点餐系统

目 录 第一章 绪论 1 1.1系统研究背景和意义 1 1.2研究现状 1 1.3研究主要内容 2 第二章 相关技术说明 3 2.1 JSP(Java Server Page)简介 3 2.2 Spring框架简介 4 2.3 Spring MVC框架简介 5 2.4 MyBatis 框架简介 5 2.4 MySql数据库简介 6 2.6 Tomcat简介 7 2.7 jQuery简介 8 …

Hadoop原理与技术——Hbase的基本操作

点击链接查看文档 一、实验目的 上机实操&#xff0c;熟悉指令操作Hbase和java代码操作Hbase 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内容 1&#xff1a;指令操作Hbase (1)&#xff1a;start-all.sh&#xff0c;启动所有进程 (2)…

Ansys(Maxwell、Simplorer)与Simulink联合仿真(二)直线电机

Ansys&#xff08;Maxwell、Simplorer&#xff09;与Simulink联合仿真&#xff08;二&#xff09;直线电机 在仿真过程中&#xff0c;遇到了一个问题&#xff0c;卡了好久得到了解决。 关于 motion setup 提示 moving 找不到面 cannot find the sarface 所有的动态部件要隔开…

【pen200-lab】10.11.1.21(实际获得22权限)

pen200-lab 学习笔记 【pen200-lab】10.11.1.21 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

算法导论24章单源最短路径—Bellman-Ford算法 Dijkstra算法

松弛操作 松弛操作就是判断从现在s到v的路径更近&#xff0c;还是我从s到u再到v更近&#xff0c;选一个更近的走。 松弛操作的例子 松弛是唯一导致最短路径估计和前驱结点变化的操作 Bellman-Ford算法 第一个循环&#xff0c;循环V-1次&#xff0c;每次循环对所有的边都松弛一…

Python数据分析-matplotlib

目录 一、折线图&#xff1a;plt.plot() 1.1 plt.plot()基本用法 1.2 设置坐标轴范围&#xff1a;plt.axis([xmin,xmax,ymin,ymax]) 1.3 plt.plot()绘制多个图形 1.4 linewidth设置线条宽度 1.5 使用plt.plot()的返回值设置线条属性 1.6 plt.setp()修改线条性质 1.7 对…

软件测试的几种方法

1、从是否关心内部结构来看 (1)白盒测试&#xff1a;又称为结构测试或逻辑驱动测试&#xff0c;是一种按照程序内部逻辑结构和编码结构&#xff0c;设计测试数据并完成测试的一种测试方法。 (2)黑盒测试&#xff1a;又称为数据驱动测试&#xff0c;把测试对象当做看不见的黑盒…

讲透金融风控建模全流程(附 Python 代码)

信贷风控是数据挖掘算法最成功的应用之一&#xff0c;这在于金融信贷行业的数据量很充足&#xff0c;需求场景清晰及丰富。 信贷风控简单来说就是判断一个人借了钱后面&#xff08;如下个月的还款日&#xff09;会不会按期还钱。更专业来说&#xff0c;信贷风控是还款能力及还…

SQL 汇总统计及GROUP BY

SQL 汇总统计1、汇总统计2、GROUT BY3、如何对分组统计的结果进行过滤&#xff1f; GROUP BY HAVING4、如何对分组统计的结果进行排序&#xff1f;GROUP BY ORDER BY5、介绍SELECT语句中各个子句的书写顺序6、备注&#xff1a; 上方用到的表1、汇总统计 介绍几个聚集函数 有…

电脑误删Path环境变量后前端如何重新配置所需变量

需求背景 &#xff1a; 当时公司需要我们安装一款软件 &#xff0c; 按照操作文档需要配置一下 Path 环境变量 &#xff0c; 但当时的云桌面操作系统是 window7系统 &#xff0c; 当时配置时并不知道新的变量配置时需要在前面一个的后面加 “ &#xff1b; ” 来间隔开来…

【目的:windows下VS2017/2022使用MSVC编译GLFW库】

目的&#xff1a;windows下VS2017/2022使用MSVC编译GLFW库 环境&#xff1a; 系统&#xff1a;Win10 环境&#xff1a;VS2017 64bit步骤&#xff1a; 1.下载GLFW源码 官网链接https://www.glfw.org/download.html&#xff0c; 下载glfw的源码&#xff0c;解压到本地&#x…

考研数据结构大题整合_组二(TJP组)

考研数据结构大题整合 目录考研数据结构大题整合二、TJP组TJP组一TJP组二TJP组三二、TJP组 TJP组一 四、画图/计算/证明/算法分析&#xff08;30分&#xff09; &#xff08;1&#xff09;证明题&#xff08;8分&#xff09; 如果一棵树有n1个度为1的结点&#xff0c;n2个度为…

(四)Vue之数据绑定

文章目录数据绑定单向数据绑定双向数据绑定Vue学习目录上一篇&#xff1a;&#xff08;三&#xff09;Vue之模板语法 数据绑定 Vue中有2种数据绑定的方式&#xff1a; 1.单向绑定&#xff1a;数据只能从data流向页面。2.双向绑定&#xff1a;数据不仅能从data流向页面&#…

著名书画家、中国书画院院士李适中

著名书画家、中国书画院院士李适中 李适中 著名书画家、中国书画院院士 版画艺术家 文物复制专家 中国文物学会会员单位创始人 文化部科技进步奖获得者 艺术简历 李适中&#xff0c;1943年生&#xff0c;安徽颍上人&#xff0c;著名书画家、中国书画院院士。李适中先生师从著名…

Vue3+nodejs全栈项目(资金管理系统)——前端篇

文章目录创建项目项目初始化使用element-plus设置Register和404组件搭建element注册表单验证表单和按钮加载动画和消息提醒路由守卫和token过期处理配置请求拦截和响应拦截解析token并存储到vuex中设计顶部导航设置首页和个人信息设置左侧导航栏展示资金管理页面添加按钮编辑和…