代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

news/2024/9/23 7:29:24/

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

  • 1143.最长公共子序列
    • 解法一:动态规划
  • 1035.不相交的线
    • 解法一:动态规划
  • 53. 最大子序和 动态规划
    • 解法一:动态规划
    • 解法二:贪心算法


1143.最长公共子序列

教程视频:https://www.bilibili.com/video/BV1ye4y1L7CQ
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i][j]含义:表示以text1从0 ~ i-1个字符和text2从0 ~ j-1个字符之间最长公共子序列的长度。
2、递归公式:当前会有两种状况:
a. text1.charAt(i-1)==text2.charAt(j-1),相同则dp[i][j]=dp[i-1][j-1]+1;
b. text1.charAt(i-1)!=text2.charAt(j-1),不相同则比较从哪边获得的长度最大:dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]);
3、dp初始化:dp[i][0]和dp[0][j]没有实际意义,为保证递归,全部初始化为0
4、遍历顺序:外层遍历text1,内层遍历text2
5、打印验证。

class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp =new int[text1.length()+1][text2.length()+1];int maxLength = 0;for(int i=1;i<=text1.length();i++){for(int j=1;j<=text2.length();j++){if(text1.charAt(i-1)==text2.charAt(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]);}maxLength=Math.max(maxLength,dp[i][j]);}}return maxLength;}
}

1035.不相交的线

教程视频:https://www.bilibili.com/video/BV1h84y1x7MP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:(本题同上一题【1143.最长公共子序列】)
1、dp[i][j]含义:表示以nums1从0 ~ i-1和nums2从0 ~ j-1范围之间最长公共子序列的长度。
2、递归公式:当前会有两种状况:
a. nums1[i - 1] 与 nums2[j - 1]相同,相同则dp[i][j]=dp[i-1][j-1]+1;
b. nums1[i - 1] 与 nums2[j - 1]不相同,不相同则比较从哪边获得的长度最大:dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]);
3、dp初始化:dp[i][0]和dp[0][j]没有实际意义,为保证递归,全部初始化为0
4、遍历顺序:外层遍历text1,内层遍历text2

class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int[][] dp = new int[nums1.length+1][nums2.length+1];int maxLength = 0;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-1][j], dp[i][j-1]);}maxLength=Math.max(maxLength,dp[i][j]);}}return maxLength;}
}

53. 最大子序和 动态规划

教程视频:https://www.bilibili.com/video/BV19V4y1F7b5
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i]含义:以nums[i-1]为结尾的最大连续子数组和。
2、递归公式:dp[i]=nums[i-1]+Math.max(dp[i-1], 0);
3、dp初始化:dp[0]没有实际意义,为保证递归,初始化为0,其余索引值都会在递归时被覆盖无需考虑。由于数组和可能是负数,需要将maxSum初始化为Integer.MIN_VALUE
4、遍历顺序:正向遍历
5、打印验证。

class Solution {public int maxSubArray(int[] nums) {int[] dp =new int[nums.length+1];int maxSum=Integer.MIN_VALUE;for(int i=1;i<=nums.length;i++){dp[i]=nums[i-1]+Math.max(dp[i-1],0);maxSum=Math.max(maxSum,dp[i]);}return maxSum;}
}

解法二:贪心算法

53. 最大子序和



http://www.ppmy.cn/news/93975.html

相关文章

Systrace系列9 —— MainThread 和 RenderThread 解读

本文是介绍 Android App 中的 MainThread 和 RenderThread,也就是大家熟悉的主线程和渲染线程。文章会从 Systrace 的角度来看 MainThread 和 RenderThread 的工作流程,以及涉及到的相关知识:卡顿、软件渲染、掉帧计算等。 这里以滑动列表为例 ,我们截取主线程和渲染线程一…

vite的使用

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

一文读懂:什么是数组

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 什么是数组 Java是一种面向对象的编程语言&#xff0c;提供了许多数据结构来处理和组织数据。其中&#xff0c;数组是一种常见且强大的数据结构&#xff0c;是存放在…

递归的基本概念

分类&#xff1a; 直接递归 间接递归 如果递归函数中调用递归的语句为最后一个执行语句&#xff0c;则称这种递归为尾递归 递归使用条件 原问题可以划为一个或多个子问题&#xff0c;且子问题的求解方式与原问题相同&#xff0c;只是数量规模不同 递归的调用次…

Ubuntu crontab 遇到的sh脚本一些问题(手动执行可以,自动执行不行)

问题一&#xff1a; 问题描述&#xff1a; 在写一个脚本循环时候&#xff0c;出现“let:not found”,这是因为在ubuntu默认是指向bin/dash解释器的,dash是阉割版的bash,其功能远没有bash强大和丰富.并且dash不支持let和i等功能. 解决办法&#xff1a; 打开一个终端输入&#xf…

PGXC GaussDB

PGXCA PGXC&#xff08;PostgreSQL eXtended Coordinator&#xff09;是一个基于 PostgreSQL 架构的分布式数据库解决方案。它扩展了 PostgreSQL&#xff0c;为用户提供了在多个节点上分布式存储和处理数据的能力。 PGXC 的设计目标是将 PostgreSQL 扩展为能够处理大规模数据…

Python类的属性和方法介绍

Python类的属性和方法介绍 本文主要讲python类属性&#xff08;类变量&#xff09;、实例属性&#xff08;实例变量&#xff09;&#xff1b;类方法、静态方法、实例方法。 【定义在类中的变量也称为属性&#xff0c;定义在类中的函数也称为方法。】 这些都是Python面向对象…

Linux 软件包管理工具

rpm命令管理软件包 1.学会看rpm包&#xff0c;通过rpm包的名字来了解这个软件包的一些基础信息xfsprogs-4.19.0-2.el8.x86_64.rpm xfsprogs 软件名字 4.19.0 版本号 2 发行次数 el8 适用于哪个操作系统&#xff08;rel8&#xff09; x86_64 软…