【Leetcode】DP | 序列及子数组问题

news2024/11/16 3:29:46

300 最长递增子序列

求数组最长严格递增子序列的长度。

D [ i ] D[i] D[i]代表以 n u m s [ i ] nums[i] nums[i]结尾的最长递增子序列的长度。
D [ i ] = max ⁡ j < i ,   n u m s [ i ] > n u m s [ j ] ( D [ j ] + 1 ) D[i] = \max_{j < i,\ nums[i]>nums[j]}(D[j] + 1) D[i]=j<i, nums[i]>nums[j]max(D[j]+1)
Q1: O ( n 2 ) O(n^2) O(n2)版本如何提速到 O ( n log ⁡ n ) O(n\log n) O(nlogn)

Q2:能否输出路径?这个不难,增加一个 r e c o r d record record​数组就好。


写了第二遍了,但完全找不到贪心+二分查找的记忆……但看了一遍又不得不感叹巧妙。

贪心思想:保持长度为 i i i的递增子序列,尾部元素值最小。比如[1,2,3,5][1,2,3,4],优先选择 [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4]

维护一个列表 t a i l tail tail t a i l [ i ] tail[i] tail[i]表示长度为 i + 1 i+1 i+1的递增子序列,能够获得的最小尾部元素值。

  • n u m s [ i ] nums[i] nums[i]大于 t a i l tail tail数组的最后一个有效元素时,将其放在 t a i l tail tail数组的最后;
  • 否则插入 n u m s [ i ] nums[i] nums[i],若 t a i l s [ j − 1 ] < n u m s [ i ] ≤ t a i l s [ j ] tails[j-1] < nums[i] \le tails[j] tails[j1]<nums[i]tails[j],则插入 n u m s [ i ] nums[i] nums[i]到位置 j j j

注意 t a i l tail tail数组中的元素并不一定是路径,反例为下图中蓝色部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KcUOC5d-1686490291899)(【Leetcode】DP-序列及子数组问题/image-20230611200304857.png)]

674 最长连续递增子序列

D [ i ] = n u m s [ i ] > n u m s [ i − 1 ]   ?   D [ i − 1 ] + 1 : 0 D[i] = nums[i]>nums[i-1]\ ?\ D[i-1] + 1 : 0 D[i]=nums[i]>nums[i1] ? D[i1]+1:0

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int maxLength = 1;
        int length = 1;
        for (int i = 1; i < nums.length; i++) {
            length = nums[i] > nums[i - 1] ? length + 1 : 1;
            maxLength = Math.max(length, maxLength);
        }
        return maxLength;
    }
}

718 最长重复子数组

给定两个数组,返回两个数组中公共的、长度最长的子数组。

D [ i , j ] D[i,j] D[i,j]表示以 n u m s 1 [ i ] 、 n u m s 2 [ j ] nums1[i]、nums2[j] nums1[i]nums2[j]结尾的公共子数组最大长度。

TODO:滑动窗口解法。

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int[][] D = new int[m][n];
        int max = Integer.MIN_VALUE;

        for (int i = 0; i < m; i++) {
            D[i][0] = nums1[i] == nums2[0] ? 1 : 0;
            max = Math.max(D[i][0], max);
        }

        for (int j = 0; j < n; j++) {
            D[0][j] = nums1[0] == nums2[j] ? 1 : 0;
            max = Math.max(D[0][j], max);
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                D[i][j] = nums1[i] == nums2[j] ? D[i - 1][j - 1] + 1 : 0;
                max = Math.max(D[i][j], max);
            }
        }

        return max;
    }
}

1143 最长公共子序列

D [ i , j ] D[i,j] D[i,j]表示 n u m s 1 [ 0 : i ] 、 n u m s [ 0 : j ] nums1[0:i]、nums[0:j] nums1[0:i]nums[0:j]的公共子序列最大长度。

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        char[] str1 = text1.toCharArray();
        char[] str2 = text2.toCharArray();
        
        int m = str1.length;
        int n = str2.length;
        int[][] D = new int[m][n];

        D[0][0] = str1[0] == str2[0] ? 1 : 0;
        for (int i = 1; i < m; i++) {
            D[i][0] = D[i - 1][0] == 1 || str1[i] == str2[0] ? 1 : 0;
        }

        for (int j = 1; j < n; j++) {
            D[0][j] = D[0][j - 1] == 1 || str1[0] == str2[j] ? 1 : 0;
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                D[i][j] = str1[i] == str2[j] ? D[i - 1][j - 1] + 1 : Math.max(D[i - 1][j], D[i][j - 1]);
            }
        }

        return D[m - 1][n -1];
    }
}

1035 不相交的线

感觉和上一题是一样滴耶。

D [ i , j ] D[i,j] D[i,j]表示 n u m s 1 [ 0 : i ] 、 n u m s [ 0 : j ] nums1[0:i]、nums[0:j] nums1[0:i]nums[0:j]最多不相交的线的数量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TlXP3fHL-1686490291900)(【Leetcode】DP-序列及子数组问题/image-20230611211545382.png)]

class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;

        int[][] D = new int[m][n];
        D[0][0] = nums1[0] == nums2[0] ? 1 : 0;
        for (int i = 1; i < m; i++) {
            D[i][0] = D[i - 1][0] == 1 || nums1[i] == nums2[0] ? 1 : 0;
        }
        for (int j = 1; j < n; j++) {
            D[0][j] = D[0][j - 1] == 1 || nums1[0] == nums2[j] ? 1 : 0;
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                D[i][j] = nums1[i] == nums2[j] ? D[i-1][j-1] + 1 : Math.max(D[i][j - 1], D[i - 1][j]);
            }
        }

        return D[m - 1][n - 1];
    }
}

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

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

相关文章

什么是Vue的UI框架?

什么是Vue的UI框架&#xff1f; Vue.js 是一款流行的 JavaScript 框架&#xff0c;用来构建现代的单页面应用程序&#xff08;SPA&#xff09;。Vue.js 提供了丰富的功能和 API&#xff0c;但是在构建应用程序时&#xff0c;我们还需要使用一些 UI 组件来实现复杂的交互和界面…

【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

02- 输入、输出及运算符(C语言)

一 输入、输出 1.1 输出函数 printf 函数是一个可变参数函数&#xff0c;参数的个数不定&#xff1a;int printf(const char *format, ...) printf("%d\n", x); printf("%d %d\n", x, y); 1.2 输入函数 1.2.1 scanf函数&#xff1a;int scanf(const …

利用AI点亮副业变现:5个变现实操案例的启示

AI变现副业实操案例 宝宝起名服务AI科技热点号头像壁纸职业头像收徒&#xff1a;萌娃头像定制头像平台挂载 小说推广号流量营销号百家号AI共创计划公众号流量主 知识付费知识星球小报童&#xff1a; 整体思维导图&#xff1a; 在这里先分享五个实操案例: 宝宝起名服务AI科技热…

[MySQL]一文带你学明白数据库控制语言——DCL

前言 嗨咯&#xff0c;小伙伴大家好呀&#xff01;好几天没见了&#xff0c;周末过得怎么样啊&#xff01;之前学过的SQL语句不会都忘了吧。如果忘了的话大家可以看一下前几期的文章。本期要学习的是SQL语句中的数据库控制语句——DCL&#xff0c;学习完毕之后MySQL中的SQL语句…

探索ll-hls低延迟直播协议

HLS全称为HTTP Live Streaming&#xff0c;其中m3u8作为描述协议&#xff0c;指向一系列切片文件。支持多码流与自适应码率&#xff0c;支持广告无缝播放&#xff0c;支持CMAF协议的低延时直播&#xff0c;也支持CDN动态选择。 我们先看下HLS整体架构&#xff0c;由三部分构成…

存储技术3 数据保护: RAID

Why RAID 性能限制了磁盘驱动单独的驱动存在预期的使用寿命 MTBF测量若一个驱动器的MTBF是750 000小时&#xff0c; 阵列中有100个驱动&#xff0c; 阵列的MTBF会变成 750000 / 100 7500小时 RAID用于减缓这个问题RAID特点 增大容量高可用性增强的性能 RAID implementation…

仿微信我的列表功能菜单按钮 我的个人中心页面功能菜单

前端vue自定义仿微信我的列表功能菜单按钮 我的个人中心页面功能菜单, 下载完整代码请访问https://ext.dcloud.net.cn/plugin?id12990 效果图如下: #### 使用方法 使用方法 <!-- leftTitle:标题 icon&#xff1a;左边图标 click&#xff1a;点击事件 --> <ccMe…

【java】IO流

IO流 原理 分类 字节流与字符流 节点流与包装流 Java IO详解&#xff08;五)------包装流 - YSOcean - 博客园 (cnblogs.com)JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流_过滤流和缓冲流,字节流的关系_X-Dragon烟雨任平生的博客-CSDN博客 字符流 i…

算法模板(4):动态规划(2)

8.树形DP 没有上司的舞会 树上最大独立集问题 Ural 大学有 N N N 名职员&#xff0c;编号为 1 ∼ N 1 \sim N 1∼N。他们的关系就像一棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。每个职员有一个快乐指数&#xff0c;用整数 H i H_i Hi​ 给出&#xff0c;…

顺序查找和折半查找

顺序查找和折半查找 顺序查找 一、算法思想 顺序查找&#xff0c;又叫“线性查找”&#xff0c;通常用于线性表。 算法思想&#xff1a;从头到尾挨个找&#xff08;或者反过来也OK&#xff09; 二、算法实现 结构体定义 typedef struct{ElemType *elem;int TableLen; }SS…

SpringBoot + Vue 的留守儿童系统的研究与实现

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 1.研究背景 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&#xff0c;传统的管理方式已经无法满足现代人们的需求&#xff1b;使用留…

变压器差动保护的影响因素和相应的措施

由于变压器一、二次电流、电压大小不同&#xff0c;相位不同&#xff0c;电流互感器特性差异&#xff0c;电源侧有励磁电流&#xff0c;都将造成不平衡电流流过继电器&#xff0c;必须采用相应措施消除不平衡电流的影响。 主要措施 &#xff08;1&#xff09;减小稳态情况下的…

SpringCloud学习笔记(四)RabbitMQ

一、同步通讯的优缺点 时效性较强&#xff0c;可以立即得到结果但是耦合度高&#xff0c;性能和吞吐能力下降有额外的资源消耗 二、异步通讯的优缺点 耦合度低&#xff0c;吞吐量提升故障隔离&#xff0c;流量削峰依赖于Broker的可靠性、安全性和吞吐能力 三、什么是MQ MQ…

物联网Lora模块从入门到精通(七)串口通讯

一、前言 在Lora模块的程序设计中&#xff0c;串口通信一定是一个极其重要且常用的通信方式&#xff0c;借助串口通信&#xff0c;我们不但可以向外传输我们获取的数据&#xff0c;还可以根据外部指令做出相应。 同样的&#xff0c;在例程中&#xff0c;为我们提供了一个名为us…

SSM简易项目实战(基本CRUD操作):速速来学+项目完整源码

前言&#xff1a;又是一年暑期将至&#xff0c;找实习&#xff1f;手里没几个项目恐怕不行&#xff0c;今天给各位带来一个较为简易的Web项目&#xff0c;快来学吧&#xff01; 一、项目简介 1、云借阅图书管理系统 技术栈&#xff1a;&#xff08;SpringSpringMVCMybatisMyS…

【面试必问】Spring核心之控制反转(IOC)

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 &#x1f495;&#x1f495; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#…

驱动开发:内核封装WFP防火墙入门

WFP框架是微软推出来替代TDIHOOK传输层驱动接口网络通信的方案&#xff0c;其默认被设计为分层结构&#xff0c;该框架分别提供了用户态与内核态相同的AIP函数&#xff0c;在两种模式下均可以开发防火墙产品&#xff0c;以下代码我实现了一个简单的驱动过滤防火墙。 WFP 框架分…

触发器和事件自动化的讲解

触发器和事件自动化 一、触发器 1、触发器的基本概念 触发器是和表相关的一种数据库对象&#xff0c;可以将他看作一种特殊的存储过程&#xff0c;不需要人为调动的存储过程。 关键字&#xff1a;trigger 基本作用&#xff1a;通过对表进行数据的插入、更新或删除等操作来触…

UnityVR--AudioManager--音频管理中心

目录 前言 建立音频配置文件AudioConfig 建立音频管理AudioManager 使用AudioManager播放音效 前言 关于音频组件的简单使用请详见VideoPlayer&AudioSource&#xff0c;不过在一个工程项目中&#xff0c;会有很多的声音文件&#xff0c;播放的时间和条件也不相同&#…