代码随想录算法训练营第五十三天 | LeetCode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

代码随想录算法训练营第五十三天 | LeetCode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

文章链接:最长公共子序列、不相交的线、最大子数组和
视频链接:最长公共子序列、不相交的线、最大子数组和

1. LeetCode 1143. 最长公共子序列

1.1 思路

  1. 在718. 最长重复子数组中的重复子数组要求是连续的,本题也是要求重复子数组,要按照数组的顺序,虽然可以不连续。本题用动态规划解决的难点在于如何去表示这两个数组进行比较的状态,在718. 最长重复子数组中我们是用二维数组比较的,横向表示 nums1,纵向表示 nums2

  2. dp 数组及其下标的含义:dp[i][j]:长度以 [0,i-1] 的 nums1 和长度以 [0,j-1] 的 nums2 的最长公共子序列为 dp[i][j]。为什么定义 i-1 而不是 i 呢?其实也可以,但是那么写可以精简一些初始化的地方,如果写成 i 就需要对第一行和列初始化

  3. 递推公式:我们肯定要比较元素是否相同,即 if(nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1,就是在这基础上加 1。如果不相同,即 else dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])
    在这里插入图片描述

  4. dp 数组的初始化:从递推公式可看出,i,j 是需要这三个方向推导出来的,因此要把第一行和列初始化了,即 dp[0][j] 和 dp[i][0],那么根据 dp 数组的含义,是跟 [0,i-1] 和 [0,j-1] 比较,本来就是 0 了再减 1 就成负的,就是一个空的字符串的,那么即 nums1 和空的字符串的最长公共子序列以及 nums2 和空的字符串的最长公共子序列就应该是 0,因此都初始化为 0。而其余下标会被其他位置覆盖,就也初始化为 0 即可
    在这里插入图片描述

  5. 遍历顺序:根据上图的方向,因此是从左往右遍历。for(int i=1;i<=nums1.length;i++)for(int j=1;j<=nums2.length;j++)为什么从 1 开始,因为第一行和列都初始化了,并且递推公式也是从 i-1 和 j-1 推导来的,因此从 1 开始,为什么需要等于号,因为根据 dp 数组的含义,我们的数组范围是 [0,i-1] 和 [0,j-1],只有去等于号了,才能取到数组的最后一个元素,而我们定义 dp 数组时也应该定义个长度为 nums1.length+1,nums2.length+1。最终结果存在 dp[nums1.length][nums2.length]

  6. 打印 dp 数组:用于 debug

1.2 代码

/*
	二维dp数组
*/
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        // char[] char1 = text1.toCharArray();
        // char[] char2 = text2.toCharArray();
	// 可以在一開始的時候就先把text1, text2 轉成char[],之後就不需要有這麼多爲了處理字串的調整
	// 就可以和卡哥的code更一致
 	
        int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作
        for (int i = 1 ; i <= text1.length() ; i++) {
            char char1 = text1.charAt(i - 1);
            for (int j = 1; j <= text2.length(); j++) {
                char char2 = text2.charAt(j - 1);
                if (char1 == char2) { // 开始列出状态转移方程
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[text1.length()][text2.length()];
    }
}

2. LeetCode 1035. 不相交的线

2.1 思路

  1. 本题要在两个数组中找到相同的数字然后连成线,并且线之间不能相交。本题很容易陷进去怎么判断线不能相交的问题。我们要找的是相同元素,同时保证数组顺序不变,其实也是求子序列问题。举例如果两个数组是 [1,2][2,1] 那这是相同子序列吗?不是,这里相同子序列只能是 1 和 1 或者 2 和 2。那本题让我们找最多条可连接的线,就相当于找最长公共子序列,那和1143. 最长公共子序列就一样了。
  2. 因此本题的解题逻辑和我在1143. 最长公共子序列这题的是一样的。

2.2 代码

  class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int[][] dp = new int[len1 + 1][len2 + 1];

        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; 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 - 1][j], dp[i][j - 1]);
                }
            }
        }

        return dp[len1][len2];
    }
}

3. LeetCode 53. 最大子数组和

3.1 思路

  1. 本题是给一个数组求最大子序和,指的就是子数组的最大和,子数组就是连续的子序列,求出和是在这个数组的子数组中最大的。本题可以暴力也可以贪心,但这里用动态规划做。
  2. dp 数组及其下标的含义:dp[i]:以 i 为结尾(即元素 nums[i])的最大连续子序列的和为 dp[i]
  3. 递推公式:有两种情况,1 是延续着前面的子序列的和继续累加;2 是不延续前面的子序列,从现在的位置重新开始算。第 1 种情况,nums[i] 前面的和就是以 i-1 为结尾的最大子序列和 dp[i-1],即 dp[i-1]+nums[i],第 2 种情况就是不要前面的了,即 nums[i]。因此 dp[i]=Math.max(dp[i-1]+nums[i],nums[i])
  4. dp 数组的初始化:dp[i] 是依赖 dp[i-1] 的,源头是 dp[0],因此初始化为 nums[0],即以第一个元素为结尾的最大子序列和,非 0 下标会被覆盖,因此默认初始化为 0 即可
  5. 遍历顺序:按照递推公式就是从前往后遍历,for(int i=1;i<nums.length;i++)从 1 开始是因为 0 位置已经初始化了,结果是整个 dp 数组的最大值,用 if(result<=dp[i])result=dp[i],而不是 dp[nums.length-1] 的位置,因为未必是以最后一个元素为结尾的最长子序列和最大。
  6. 打印 dp 数组:用于 debug

3.2 代码

/**
     * 1.dp[i]代表当前下标对应的最大值
     * 2.递推公式 dp[i] = max (dp[i-1]+nums[i],nums[i]) res = max(res,dp[i])
     * 3.初始化 都为 0
     * 4.遍历方向,从前往后
     * 5.举例推导结果。。。
     *
     * @param nums
     * @return
     */
    public static int maxSubArray(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        int res = nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            res = res > dp[i] ? res : dp[i];
        }
        return res;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LTspice导入spice模型

一、创建原理图&#xff08;原件的样子&#xff09; 1、下载spice模型 2、用LTspice打开spice模型 3、选中模型名称&#xff0c;选择创建 4、可以自己画模型 导入后都是方块的&#xff0c;可以自己画模型的样子&#xff0c;所有引脚和模型名称都跟器件一样可以移动 da 画模…

微服务系列-使用 RestTemplate 的 Spring Boot 微服务通信示例

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信。 微服务通信有两种风格&#xff1a; 同步通讯异步通信 同步通…

【C++初阶(六)】类和对象(中)与日期类的实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

如何挑选RPA开发商?

其实&#xff0c;只要在这个行业调查的时间足够&#xff0c;不难发现里面有很多弯弯绕绕。 首先&#xff0c;RPA厂商虽然很多&#xff0c;但是优秀的RPA厂商就那么几家&#xff0c;它们都有各自擅长的领域&#xff0c;像金智维&#xff0c;就是在金融领域、政务领域&#xff1…

【Python3】【力扣题】268. 丢失的数字

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;哈希。元素去重&#xff0c;依次判断是否在0-n内&#xff0c;没有则返回。 知识点&#xff1a;set(...)&#xff1a;转为集合&#xff0c;集合中的元素不重复。 class Solution:def mis…

打破语言壁垒,实现全球商贸:多语言多商户跨境商城源码引领电商新潮流

随着全球化的不断深入&#xff0c;电子商务的蓬勃发展&#xff0c;传统的单语言电商模式已经无法满足日益多元化的市场需求。多语言多商户跨境商城源码&#xff0c;一种创新的电商解决方案&#xff0c;应运而生。它打破了语言和地域的限制&#xff0c;让全球的商家和消费者都能…

uniapp打包安卓app获取包名

uniapp打包安卓app获取包名的两种方式 1.uniapp云打包 这上面直接可以看到包名&#xff0c;可以修改&#xff0c;也可以在 manifest.json 文件中配置修改 package配置的就是包名&#xff0c;要确保唯一性 2.使用aapt工具获取 1.下载aapt工具&#xff0c;然后添加到环境变量…

tcpdump wireshark简单使用

tcpdump工作原理 tcpdump 是 Linux 系统中非常有用的网络工具&#xff0c;运行在用户态&#xff0c;本质上是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能&#xff0c;利用内核中的 AF_PACKET 套接字&#xff0c;抓取网络接口中传输的网络包。查 看 tcpdump 的 手册…

驱动程序编进内核或则编成模块

驱动程序可以编进内核或则编成模块 驱动程序编成模块 打开/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/char/Kconfig文件&#xff0c;添加以下信息。 在/home/book/100ask_imx6ull-sdk/Linux-4.9.88在目录下使用make memuconfig命令查看配置菜单。 可以按/&#…

二叉树理论碎碎记

二叉树的种类 在刷题的过程中&#xff0c;我们主要关注两种主要形式&#xff1a;满二叉树和完全二叉树。 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。如下图所示&#xff1a;这棵二叉…

【机器学习基础】机器学习的基本术语

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

ubuntu20.04有公网ip如何做端口映射?

一&#xff0c;有公网IP时如何做端口映射&#xff1f; 然后打开浏览器&#xff0c;输入192.168.2.1自己路由地址&#xff0c;进入路由器的控制面板&#xff08;如果不知道用户名和密码&#xff0c;可以在自己路由设备背面可见默认帐号密码&#xff09;。 点击转发规则&…

ESP32 Arduino实战基础篇-生成 PWM 信号

在本教程中,我们将向您展示如何使用 Arduino IDE 通过 ESP32 生成 PWM 信号。作为示例,我们将构建一个简单的电路,使用 ESP32 的 LED PWM 控制器对 LED 进行调光。我们还将向您展示如何同时在不同的 GPIO 上获取相同的 PWM 信号。 在继续本教程之前,您应该在 Arduino IDE 中…

pytorch-gpu(Anaconda3+cuda+cudnn)

文章目录 下载Anaconda3安装&#xff0c;看着点next就行比较懒所以自动添加path测试 cuda安装的时候不能改路径如果出现报错&#xff0c;关闭杀毒软件一直下一步就好取消勾选“CUDA”中的“Visual Studio Intergration”一直下一步即可测试安装成功 cudnn解压后将这三个文件夹复…

2023湖南省赛

​​​​​​连接 目录 A:开开心心233 B:Square Game F:necklace K:tourist 补题中&#xff0c;会给出大部分代码 A:开开心心233 签到题 &#xff0c;无论二分还是解方程还是直接for循环枚举都能直接通过啦 signed main() {ios_base::sync_with_stdio(0); cin.tie(0),co…

基于FPGA的图像RGB转HLS实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1计算最大值和最小值 4.2计算亮度L 4.3计算饱和度S 4.4计算色调H 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到MATLAB显示效果&#xff1a; 2.算法运行软件版本 Vivado…

【史上最全】涵盖所有「存图方式」与「最短路算法」

题目描述 这是 LeetCode 上的 「1334. 阈值距离内邻居最少的城市」 &#xff0c;难度为 「中等」。 Tag : 「最短路」、「图」 有 个城市&#xff0c;按从 到 编号。 给你一个边数组 edges&#xff0c;其中 代表 和 两个城市之间的双向加权边&#xff0c;距离阈值是一个整…

ts+vite报错:找不到模块“/src/.../...”或其相应的类型声明

问题描述 vuets项目开发时&#xff0c;通过绝对路径引入模块&#xff0c;发现ts报错&#xff1a;找不到模块“/src/script/game”或其相应的类型声明。ts(2307)。但是项目能正常运行。 原因 由于并没有配置代表src&#xff0c;结果通过绝对路径引入还是报错&#xff0c;于是换…

国产源代码扫描工具DMSCA扫描出的报告优秀吗?

在源代码扫描工具中&#xff0c;扫描报告是非常具有参考意义的&#xff0c;一方面可以了解我们开发项目的漏洞情况&#xff0c;另一方面也可以针对扫出的漏洞进行修复&#xff0c;确保开发出安全可靠的软件。误报和漏报是一个非常重要的参考指标。 国产源代码扫描工具DMSCA&am…

andorid 日历选择器

先看效果图&#xff1a; 主要代码 package com.example.flyimport android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import…