Day44 力扣动态规划 : 300.最长递增子序列|674. 最长连续递增序列 | 718. 最长重复子数组

news2024/10/6 0:27:23

Day44 力扣动态规划 : 300.最长递增子序列|674. 最长连续递增序列 | 718. 最长重复子数组

  • 300.最长递增子序列
    • 第一印象
    • 看完题解的思路
      • dp
      • 递推公式
      • 遍历顺序
      • 初始化
    • 实现中的困难
    • 感悟
    • 代码
  • 674. 最长连续递增序列
    • 第一印象
      • dp
      • 状态转移公式
      • 遍历顺序
      • 初始化
    • 看完题解的思路
    • 实现中的困难
    • 感悟
    • 代码
  • 718. 最长重复子数组
    • 第一印象
    • 看完题解思路
      • dp数组
      • 递推公式
      • 遍历顺序
      • 初始化
    • 实现中的困难
    • 感悟
    • 代码

300.最长递增子序列

今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。
视频讲解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97.html

第一印象

我直接看题解感受子序列题目的思路

看完题解的思路

dp

这个系列的dp数组的含义是:

dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度

递推公式

这道题的递推公式不像之前的dp问题

I 和 I - 1 进行比较。

因为最长子序列是不连续的,比如 1 2 3 1 4,最长应该是 1 2 3 4

而以 1 为结尾的最长递增子序列是 1,也就是dp[3] = 1。

以 4 为结尾的最长递增子序列是 4, 他是dp[2] + 1 = 3 + 1 = 4

所以这道题比较的是,在0~i-1里对每个元素 j,如果 i 比这个元素 j 要大,那么对与当前的 j 来说,i就是一个更大的递增子序列,长度是dp[j] + 1.

但也不是每次都要更新到dp[i] ,因为求的是最大的子序列,只有当前元素 j 算出的 dp[j] + 1比dp[i] 更大的时候,才会更新。

比如上面的例子, j遍历到 1的时候,1 4是递增子序列,算出来的dp[3] + 1 = 2。

而并没有当时的dp[4] = 4更大,自然就不更新。

遍历顺序

正序遍历,内层for循环卡哥说也可以倒序遍历。

初始化

每个元素都是 1

Arrays.fill(dp, 1);

因为每个元素自己一定是一个递增子序列,就算只有自己,长度也是 1 呢。

实现中的困难

result 初始化应该是 1,因为至少答案也是 1.

感悟

学了新东西了

代码

这里打印dp数组的代码会导致超时

class Solution {
    public int lengthOfLIS(int[] nums) {
        //dp
        int[] dp = new int[nums.length];
        //init
        Arrays.fill(dp, 1);
        //function
        int result = 1;
        for (int i = 1; i < dp.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    result = Math.max(result, dp[i]);
                }
            }
            //print
            for (int k = 0; k < dp.length; k++) {
                System.out.print(dp[k]);
            }
            System.out.println();
        } 
        return result;
    }
}

674. 最长连续递增序列

本题相对于昨天的动态规划:300.最长递增子序列 最大的区别在于“连续”。 先尝试自己做做,感受一下区别
视频讲解:https://www.bilibili.com/video/BV1bD4y1778v
https://programmercarl.com/0674.%E6%9C%80%E9%95%BF%E8%BF%9E%E7%BB%AD%E9%80%92%E5%A2%9E%E5%BA%8F%E5%88%97.html

第一印象

我自己试试这个连续的区别在哪了。

首先dp数组的含义应该是没变的

dp

都是 以 nums[i] 为结尾的子序列(包含它)的最长连续递增序列长度是 dp[i] 。

状态转移公式

既然必须连续,那么 i 只需要和 i - 1比较大小,要是 i 更大的话,dp[i] = dp[i - 1] + 1就可以了。
不需要跟0~i-2 这里面的元素比较了。

遍历顺序

正需便利

初始化

和上一道题一样都是 1.

看完题解的思路

我直接做出来了!!!

实现中的困难

没有

感悟

这道题比上一道题更简单了感觉。

代码

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        //dp
        int[] dp = new int[nums.length];
        int result = 1;
        //init
        Arrays.fill(dp, 1);
        //function
        for (int i = 1; i < dp.length; i++) {
            if (nums[i] > nums[i - 1]) {
                dp[i] = dp[i - 1] + 1;
                result = Math.max(result, dp[i]);
            }
        }
        return result;
    }
}

718. 最长重复子数组

稍有难度,要使用二维dp数组了 视频讲解:https://www.bilibili.com/video/BV178411H7hV
https://programmercarl.com/0718.%E6%9C%80%E9%95%BF%E9%87%8D%E5%A4%8D%E5%AD%90%E6%95%B0%E7%BB%84.html

第一印象

第一眼感觉和上面的题没啥关系

我自己试试

想不出来和不同的状态,看题解

看完题解思路

这道题感觉相当有难度哈哈哈哈 我看一遍视频都没怎么理解。

主要不理解dp[i][j] 是以i-1 为结尾和 j-1 为结尾的元素,最长的子序列。

我理解i-1 和j-1的事情,但不怎么理解这个二维数组的意义。

模拟一下实现过程吧。
在这里插入图片描述

过程大概理解了,但也没完全明白透。

dp数组

dp[i][j] 代表 nums1 中以 i - 1为结尾,nums2 中以 j - 1为结尾时,重复子串的最长长度。

这里的i-1和j-1 是为了初始化的时候更方便。所以遍历自然也要从i=1 j=1开始。

递推公式

这里的重复子串肯定是连续的子串,才叫公共子串,要是1 3 5和 1 4 3 5,重复子串就是 35 而不是 135.

只有两个元素相同的时候,才会让重复子串的长度+1.

思路是nums1 里拿一个 i ,nums2里拿一个 j,如果两个元素相同,说明出现重复的元素。

长度就应该 + 1,但是基于谁的长度呢?

就是基于i - 1和j - 1的。也就是不拿这个i 和不拿这个 j 的情况。

但并不是从头到尾遍历一遍就行了,因为1 2 3 2 1和 3 2 1 4 7的例子,重复的部分是从nums1[2] 和 nums2[0] 开始的。如果只是从头到后面遍历一次的话,就抓不到这样的重复情况了。

应该是两层for循环

for (int i = 1; i < nums1.length + 1; i++) {
            for (int j = 1; j < nums2.length + 1; j++) {

这样就是拿来nums1 里的第一个元素,然后挨个比较nums2里的 j,如果有相同,那么这个位置的最长重复子串就是 1. dp[1][j] = dp[0][j-1] + 1 = 0 + 1 = 1

再拿来nums1里的 第二个元素,挨个比较nums2里的,如果有相同,那么这个位置就是基于
dp[1][j-1] + 1 的结果。就是看不拿这两个元素的话,那个情况下最长是多少

  • 这个情况可能是 0 ,也就是在这之前还没重复过,就是0 + 1 = 1了
  • 这个情况也可能是 一个数字,比如2,也就是在这之前,已经有是连续重复的子串长度为 2 了。那么现在就是 2 + 1 = 3 这么长了。

遍历顺序

两层for循环里外都行,然后正序遍历

初始化

第一行第一列都应该是0 ,他们是非法的状态,但为了递推公式正确,应该是0

比如dp[1][1]就遇到重复元素了,dp[1][1] 应该是1。 而且递推公式的话 dp[1][1] = dp[0][0] + 1,所以都应该是 0.

实现中的困难

思路清晰的话实现没有什么问题

感悟

我觉得难在,怎么想的出这个是dp问题呢?

其次难在这个dp数组,因为要对两个数组进行操作,感觉是300.最长递增子序列的拓展。

两个数组就是二维的了那种感觉,每个元素都是一种情况。

代码

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        //dp
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        int result = 0;
        //init
        for (int j = 0; j < nums2.length + 1; j++) {
            dp[0][j] = 0;
        }
        for (int i = 0; i < nums1.length + 1; i++) {
            dp[i][0] = 0;
        }
        //func
        for (int i = 1; i < nums1.length + 1; i++) {
            for (int j = 1; j < nums2.length + 1; j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    result = result > dp[i][j] ? result : dp[i][j];
                }
            }
        }
        return result;
    }
}

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

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

相关文章

能够定时发送朋友圈的软件

此款软件提供便捷的网页端登录方式&#xff0c;让您轻松管理多个账号&#xff0c;实现多账号聚合管理&#xff0c;只需一个界面即可解决所有问题。 朋友圈内容编辑功能强大&#xff0c;让您在输入框内输入文本内容&#xff0c;点击表情图标选择表情&#xff0c;还能通过“”图标…

Go利用反射实现一个ini文件的解析器程序

package mainimport ("bufio" // 逐行读取配置文件"fmt""log""os""reflect""strconv""strings" )type Config struct { // 定义配置结构体Section1 Section1 ini:"section1" // 嵌套结构体1…

洗地机哪个牌子最好用?洗地机怎么选?2023洗地机选购推荐

家里有小孩或者是养有宠物的都有一个深刻的体验&#xff0c;那就是房子每天都很乱&#xff0c;隔三岔五就得做一次卫生清理、地板杀菌等。如果是房屋面积太大的话&#xff0c;只靠自己手动清洁是非常的耗时间并且还很劳累。洗地机的出现可谓是造福人类&#xff0c;解脱了家庭劳…

EM@一次双绝对值不等式

文章目录 一次双绝对值不等式求解步骤去绝对值情况分析&#x1f47a;例例代数法几何方法比较 例 一次双绝对值不等式求解步骤 设 f ∣ f 1 ∣ ∣ f 2 ∣ f|f_1||f_2| f∣f1​∣∣f2​∣, f 1 , f 2 f_1,f_2 f1​,f2​都是一次多项式,则原不等式 f ⩾ a f\geqslant{a} f⩾a或 …

跨越编程界限:C++到JavaSE的平滑过渡

JDK安装 安装JDK 配置环境变量&#xff1a; Path 内添加 C:\Program Files\Java\jdk1.8.0_201\bin 添加 JAVA_HOME C:\Program Files\Java\jdk1.8.0_201 添加 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 第一个Java程序 HelloWorld.java public class…

记录--让我们来深入了解一下前端“三清”是什么

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前端“三清” 在前端开发中&#xff0c;我们经常听到关于“三清”的说法&#xff0c;即 window、document、Object。这三者分别代表了 BOM(浏览器对象模型)、DOM(文档对象模型)以及 JS 的顶层对象。在…

Git精讲(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Git初识1、提出问题2、如何解决--版本控制器3、注意事项 二、Git 安装1、Linux-centos2、…

世微 升压恒压IC dc-dc转换器 充电器手持设备便携式产品 AP8660

AP8660是一款升压dc-dc转换器&#xff0c;内置MOS调节器&#xff0c;内部补偿&#xff0c;还可以最小6个外部组件&#xff0c;内部的软识启动功能可以降压涌入电流 AP8660 SOT23-6封装&#xff0c;可以为PCB提供节省空间 特点 可调输出&#xff0c;最高达到24W 内部固定PWM频…

语言大模型的预训练过程——从无尽数据到海量知识

从目前研究结果看&#xff0c;Transformer是足够强大的特征抽取器&#xff0c;通过预训练过程&#xff0c;Transformer学到了什么&#xff1f;知识是如何存取的&#xff1f;我们又如何修正错误知识&#xff1f;本文讲述这方面的研究进展。 1、求知&#xff1a;LLM学到了什么知…

【JAVA】去掉 if...else 的七种绝佳之法...

文章目录 前言方法一&#xff1a;提前 return方法二&#xff1a;枚举方案三&#xff1a;Optional 判空方案四&#xff1a;表驱动法方案五&#xff1a;策略模式 工厂方法方案六&#xff1a;责任链模式方案七&#xff1a;Function总结 前言 我相信小伙伴一定看过多篇怎么去掉 i…

解决渗透测试js文件泄露

解决办法&#xff1a;使用过滤器过滤 public class StaticSourceFilter implements Filter {private static Logger logger LoggerFactory.getLogger(StaticSourceFilter.class);Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepub…

http-server安装使用

前段时间给电脑重装了系统&#xff0c;很多东西都没了&#xff0c;今天想在浏览器打开一个本地的html文件&#xff0c;发现电脑上没有http-server&#xff0c;于是装了一个&#xff0c;并且记录下安装过程 1、安装 nodejs&#xff0c;但如果你电脑上有&#xff0c;就无需下载 …

html5 初步了解

1、html5 含义 简而言之&#xff0c;html5 其实就是新的一代html标准&#xff01; 2、html5的优缺点 优点 语义化html 增加了很多语义化的标签&#xff0c;让html结构更加清晰&#xff0c;更具可读性由于增加了很多语义化的标签&#xff0c;对SEO更加友好 缺点 其他主流浏…

day59【单调栈】503.下一个更大元素Ⅱ 42.接雨水

文章目录 503.下一个更大元素Ⅱ42.接雨水 503.下一个更大元素Ⅱ 力扣题目链接 代码随想录讲解链接 题意&#xff1a;给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数…

(只需三步)虚拟机上vm的ubuntu不能联上网怎么办

第一步&#xff1a;重启虚拟网络适配器 第二步&#xff1a;删掉网络适配器&#xff0c;重新添加 第三步&#xff1a;重启虚拟机网络服务器 sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start 再打…

【机器学习基础】机器学习入门(2)

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

【算法|动态规划 | 区间dp No.1】AcWing 282. 石子合并

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

数据结构--图解单链表

学习链表最重要的就是会画图&#xff0c;尤其是要理解链表的逻辑结构和物理结构&#xff0c;理解链表的底层原理才能使用的如鱼得水。 希望这篇文章可以帮助各位&#xff0c;记得关注收藏哦&#xff1b;若发现问题希望私信博主&#xff0c;十分感谢。 当然学习链表是需要大家对…

【PWN · heap | unlink | free_hook】[SUCTF 2018 招新赛]unlink

在前期学习了unlink后&#xff0c;今天翻NSSCTF找到一道名为unlink的题目&#xff0c;尝试不看wp做。过程很顺利&#xff01; 前言 题目对于知识点unlink还是非常裸的&#xff0c;很直接&#xff0c;思路很清晰。 一、题目 二、思路浅析 通过对该程序的反编译&#xff0c;我们…

AGV与AMR的区别

如今&#xff0c;市面上最受关注的两类工业移动机器人分别是AGV和AMR。但大众对于两者的区别还是不甚了解&#xff0c;因此小编将通过这篇文章为大家详细解释。 一、概念阐述 【AGV 】 AGV (Automated Guided Vehicle) 即自动导引运输车&#xff0c;可指基于各种定位导航技术…