代码随想录算法训练营第52天 | 动态规划 part13 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

news2024/11/26 8:39:35

#300.最长递增子序列

自己想了20min没想出来。但没关系因为没接触过该题型。我想不出来的点就是,如果i-1的最后一个不要的话,我怎么找到上一个结束点。解决方案是:再搞一个循环,一个个找(下面的 j )

下面是随想录的思路:

1. 本题dp定义非常重要:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度

每次结尾是固定的。不然新的nums不知道去和谁比较。

2. 对于每个新考虑的nums[i] ,我们从0开始找 i 之前的,谁比nums数值小,就可以考虑进来, nums[j] 作为结尾的sub

for(int i=1;i<nums.size();i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp[i]=max(dp[i],dp[j]+1);
            }
            res=max(res,dp[i]);
        }

注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值

3. 初始化记得为1,而不是0 (只有一个char是1呀)

4. 遍历顺序没有特别的

int lengthOfLIS(vector<int>& nums) {
        
        if(nums.size()==1) return 1;
        int res=0;
        vector<int> dp(nums.size(),1);
        for(int i=1;i<nums.size();i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp[i]=max(dp[i],dp[j]+1);
            }
            res=max(res,dp[i]);
        }
        return res;
    }

#674. 最长连续递增序列 easy

贪心 只要是连续的都很好做

int findLengthOfLCIS(vector<int>& nums) {
        int res=1;
        int sum=1;
        for(int i=1;i<nums.size();i++){
            if(nums[i]<=nums[i-1]) sum=1;
            else sum++;
            res=max(res,sum);
        }
        return res;
    }

dp 跟上一个非连续的区别是,只用查i-1而不是 0 ~ i-1

int findLengthOfLCIS(vector<int>& nums) {
        int res=1;
        vector<int> dp(nums.size(),1);
        for(int i=1;i<nums.size();i++){
            if(nums[i]>nums[i-1]) dp[i]=max(dp[i],dp[i-1]+1);
            res=max(res,dp[i]);
        }
        return res;
    }

#718. 最长重复子数组  经典

区分一下 子数组 subarray 连续子序列 subsequence 可以非连续

一开始以为这题是可以非连续,所以做错了。1143.最长公共子序列 这道就是 可以非连续的

本题思路(随想录):

2. 递推公式:当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1; 不然就set 0 (但是初始化已经是0了,所以不用做)

3. 4. 遍历顺序  正常

所以,代码1: dp[i][j] 代表 以 A [i -1] 和 B[j -1] 结尾的两个subarray的,不用做特别的初始化了,两层for都要从1 开始,因为0 那两条没意义,result也不在里面找。dp 大小要到size+1

int findLength(vector<int>& nums1, vector<int>& nums2) {
        //need to be continuous
        int m = nums1.size();
        int n = nums2.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));

        int max_length = 0; 

        for(int i=1; i<=m; i++){
            for(int j=1; j<=n; j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                    max_length = max(max_length, dp[i][j]); 
                }
                // else dp[i][j] = 0; 
                // not necessary as dp is initially filled with 0
            }
        }
        return max_length;
    }

代码2:改成用滚动数组。记得滚动数组想要不重复计算,内层for loop都要从后往前遍历

而且else情况也要赋值了,因为原来的default值被前面几层覆盖了

int findLength(vector<int>& A, vector<int>& B) {
        vector<int> dp(vector<int>(B.size() + 1, 0));
        int result = 0;
        for (int i = 1; i <= A.size(); i++) {
            for (int j = B.size(); j > 0; j--) {
                if (A[i - 1] == B[j - 1]) {
                    dp[j] = dp[j - 1] + 1;
                } else dp[j] = 0; // 注意这里不相等的时候要有赋0的操作
                if (dp[j] > result) result = dp[j];
            }
        }
        return result;
    }

代码三:dp含义更intuitive的:dp[i][j] 代表 以 A [i ] 和 B[j  结尾的两个subarray的

第一列和第一行就需要单独初始化。但是后面两层for loop里面,ij都要从0开始,不然会漏掉一些收集result结果。

 int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
        int result = 0;

        // 要对第一行,第一列经行初始化
        for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1;
        for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1;

        for (int i = 0; i < nums1.size(); i++) {
            for (int j = 0; j < nums2.size(); j++) {
                if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                if (dp[i][j] > result) result = dp[i][j];
            }
        }
        return result;
    }

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

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

相关文章

性能测试 Linux 环境下模拟延时和丢包实现

在性能测试过程中&#xff0c;我们还需要模拟网络异常的情况下&#xff0c;是否会出现一些异常数据。最常见的就是写库操作&#xff0c;比如说我们下单的场景&#xff0c;如果出现网络异常的时候是否会出现数据对不上这种情况。 如我们JMeter发送成功的请求数量和最终数据库表…

龙蜥白皮书精选:面向 HTTP 3.0 时代的高性能网络协议栈

文/高性能网络 SIG 01 背景概述 随着互联网特别是移动互联网的快速发展&#xff0c;对互联网通信协议提出了新的诉求。经过多年的发展&#xff0c;QUIC 协议在 2021 年正式被 IEFT 标准化&#xff0c;成为 HTTP 3 的标准传输层协议。QUIC 是基于 UDP 实现的面向连接可靠有序…

基于虚拟同步发电机控制的双机并联MATLAB仿真模型

使用MATLAB2021b打开 主要内容&#xff1a; 功率计算模块、虚拟同步发电机控制模块、电压合成模块、电压电流双环控制模块&#xff01; 1.两台VSG并联&#xff0c;开始各自带负载10KW&#xff0c;在0.3秒的时候加入公共负载10KW&#xff0c;稳定后两台VSG可以均分公共负载的…

大模型时代Embedding技术简介

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中&#xff0c;embedding是指将高维度的数据&#xff08;例如文字、图片、音频&#xff09;映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量&#xff0c;它将输入的数据表示成一个连续的数值空间中…

SciencePub学术 | 区块链类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 区块链类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; SCI-01 【期刊简介】IF&#xff1a;4.0-4.5&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCIE&EI双检&…

另一个流行漏洞。

Microsoft Office 和 Windows HTML 中的 CVE-2023-36884 漏洞。该漏洞由供应商公开披露&#xff0c;但尚未修补。Microsoft 意识到利用该漏洞的针对性攻击。据了解&#xff0c;RomCom 组织曾在此类攻击中使用勒索软件 Industrial Spy 和 Cuba。 可能导致什么后果&#xff1f; …

奇迹MU架设教程:SQL Server 2008数据库的安装教程

不管是搭建什么游戏&#xff0c;都是有数据库的&#xff0c;奇迹MU用的是SQL 数据库&#xff0c;根据服务器系统选择SQL server版本&#xff0c;我比较喜欢用Windows server 2008R2系统&#xff0c;所以我安装的是SQL server 2008。作为架设奇迹很重要的数据库程序&#xff0c;…

python中文版下载安装教程,python中文版下载官网

大家好&#xff0c;本文将围绕python中文版软件下载百度网盘展开说明&#xff0c;python中文版下载安装教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python中文最新版下载需要先了解以下几个事情。 1、python下载安装教程_百度知道 python下载安装教程&#xff1a;自…

Linux中ssh登陆慢的两种原因

useDNS配置导致登陆慢 如果ssh server的配置文件&#xff08;通常是 /etc/ssh/sshd_config &#xff09;中设置 useDNS yes &#xff0c;可能会导致 ssh 登陆卡住几十秒。将该配置项设为 no&#xff0c;然后重启 ssh 服务&#xff0c;再次登陆就恢复正常。将useDND配置为yes会…

Effective Java笔记(7)消除过期的对象引用

当你从手工管理内存的语言&#xff08;比如 C 或 C&#xff0b;&#xff0b;&#xff09;转换到具有垃圾回收功能的比如 Java 语言时&#xff0c;程序员的工作会变得更加容易&#xff0c;因为当你用完了对象之后&#xff0c;它们会被自动回收 。 当你第一次经历对象回收功能的时…

中国人民大学与加拿大女王大学金融硕士——引领你走在金融行业前沿

金融是现代经济的血脉&#xff0c;而金融行业高质量发展取决于金融人才。新常态下&#xff0c;中国经济进入新的阶段&#xff0c;同时也对金融人才培养提出了新的要求。针对在金融行业沉淀多年的在职人士而言&#xff0c;是否需要更加系统化的学习金融知识呢&#xff0c;中国人…

Python自动化之win32利器pywin32

文章目录 前言一、GUI1.1 获取、关闭窗口1.2 窗口截图1.3 创建窗口 二、文件、目录2.1 查找2.2 创建2.3 复制/移动2.4 删除2.5 读取/写入 三、服务3.1 查找3.2 安装 四、案例4.1 自动发送微信消息4.2 Excel 操作4.3 监控文件夹 参考 前言 PyWin32 是一个Python库&#xff0c;用…

【vue】路由的搭建以及嵌套路由

目的&#xff1a;学习搭建vue2项目基础的vue路由和嵌套路由 1.npm 安装 router npm install vue-router3.6.52.src下新建文件夹router文件夹以及文件index.js index.js import Vue from vue import VueRouter from "vue-router" import Home from ../views/Home.…

【Linux】- 组管理和权限管理

组管理和权限管理 1.1 Linux 组基本介绍1.2 权限的基本介绍 1.1 Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 所有者所在组其它组改变用户所在的组 文件/目录 所有者 一般为文…

关于Windows 11 docker desktop 运行doris 容器时vm.max_map_count=2000000的设置问题

需要一个简单的测试环境&#xff0c;于是准备用docker启动一个1fe 1be的简单玩一下 如果be容器启动后再去修改 /etc/sysctl.conf sysctl -w vm.max_map_count2000000 这个参数是没用的&#xff0c;be仍然会启动失败 这时可以打开cmd wsl --list C:\Users\pc>wsl --list …

Docker基础——初识Docker

Docker架构 Docker 使用客户端-服务器 (C/S) 架构模式&#xff0c;使用远程API来管理和创建Docker容器。 Docker 客户端(Client) : Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。Docker 主机(Host…

MMDeploy部署YOLOX-x模型

环境搭建 本文初始环境为PyTorch 2.0.0、Python 3.8(ubuntu20.04)、Cuda 11.8 OpenMMLab基础环境 首先安装OpenMMLab基础环境&#xff0c;以下代码均在命令窗口下输入 pip install openmim mim install mmcv-full mim install "mmengine0.7.2"git clone https://…

太阳能供电户外视频远程监控4G无线物联网工业路由器ZR3000

太阳能供电技术常被应用于环保节能的项目中&#xff0c;太阳能具备节能环保、寿命长、性能稳定、维护成本低等特点&#xff0c;被各行各业采纳使用。大多数太阳能应用于户外&#xff0c;存在监控点距离较远、取电困难、宽带光纤布线成本高、环境恶劣等问题&#xff0c;现场还有…

ansible使用playbook剧本

目录 一、执行配置文件 1、修改hosts文件 2、编写yml脚本 3、语法检查[rootansible ~] ansible-playbook --syntax-check ansible.yml 4、预测试 5、执行命令 一、执行配置文件 Playbook配置文件使用YAML语法&#xff0c;具有简介明了&#xff0c;结构清晰等特点。Playbo…

对OpenAI重拳出击!美国政府出手「开源」ChatGPT,Altman惊慌连发3推

FTC突然对OpenAI展开调查&#xff0c;Altman连发3推澄清。FTC对阵OpenAI的大戏正缓缓拉开帷幕。 重磅&#xff01;美国联邦贸易委员会的调查说来就来&#xff01; 调查对象不是别人&#xff0c;正是风头正旺的OpenAI。 一封长达20页的调查要求书直接给了Sam Altman当头棒喝。…