算法训练(leetcode)二刷第三十七天 | *300. 最长递增子序列、674. 最长连续递增序列、*718. 最长重复子数组

刷题记录

  • *300. 最长递增子序列
  • 674. 最长连续递增序列
    • 基础解法(非动规)
    • 动态规划
  • 718. 最长重复子数组
    • 滚动数组

*300. 最长递增子序列

leetcode题目地址

dp数组含义:
dp[i]表示以nums[i]结尾的最长递增子序列长度,即以nums[i]结尾的子序列的长度。
j从0向i遍历,遇到num[i] > num[j], dp[i] = max(dp[j]+1, dp[i]);

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = nums.length; 
        int[] dp = new int[len];
        int result = 1;
        // for(int i=0; i<len; i++) dp[i] = 1;
        Arrays.fill(dp, 1);
        for(int i=1; i<len; i++){
            for(int j=0; j<i; j++){
                if(nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j]+1);
            }
            if(result < dp[i]) result = dp[i];
        }
        return result;
    }
}

674. 最长连续递增序列

leetcode题目地址

基础解法(非动规)

求最长连续递增子序列,统计子序列记录最长即可。在递增中断时,计数器要置为1而非0,因为下一个子序列从当前元素开始。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int result = 1;
        int cnt = 1;
        int len = nums.length;
        for(int i=1; i<len; i++){
            if(nums[i]>nums[i-1]) {
                cnt++;
                if(cnt > result) result = cnt;
            }
            else cnt = 1; // 计数器置为1
            
        }
        return result;
    }
}

动态规划

dp数组含义:
dp[i]表示以nums[i]结尾的最长连续递增子序列的长度。

初始化:
每个元素本身就是一个连续递增子序列,因此初始化为1,即dp数组均初始化为1。

// java
class Solution {
    public int findLengthOfLCIS(int[] nums) {

        int len = nums.length;
        int[] dp = new int[len];
        Arrays.fill(dp, 1);
        int result = 1;
        for(int i=1; i<len; i++){
            if(nums[i] > nums[i-1]) dp[i] = dp[i-1]+1;
            result = Math.max(result, dp[i]);
        }
        return result;
        
    }
}

718. 最长重复子数组

leetcode题目地址

dp数组含义:
dp[i][j]表示 以nums1[i-1]结尾的子数组A 和以 以nums2[j-1]结尾的子数组B 的最长重复子数组长度。

这里为什么要用i-1和j-1?
因为dp[i][j]的更新依赖于dp[i-1][j-1]的值。也就是说,在nums1[i-1]和nums2[j-1]相等时,更新对应位置长度需要依赖nums1[i-2]和nums2[j-2]的最长重复子数组长度。
以题目示例1举例:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]

  • 当nums1[2] == nums2[0]时,当前位置的最长重复子数组长度依赖于前面的匹配情况,前面相等的串长度为0,因此这里dp[3][1]是1。
  • 当nums1[3] == nums2[1]时,逻辑同上,dp[4][2]的更新依赖于前面的匹配情况,前面有一个元素匹配到,因此这里dp[4][2] = dp[3][1]+1 = 2
  • 当nums1[4] == nums2[2]时,逻辑同上,dp[5][3]的更新依赖于前面的匹配情况,前面有两个元素匹配到,因此这里dp[5][3] = dp[4][2]+1 = 3

到这里就可以总结出状态转移方程,dp[i][j] = dp[i-1][j-1] + 1
由于这里使用了i-1和j-1,在i和j为0时会越界。 因此整体将dp数组下标后移一位,来解决这一问题。(也可单独处理i和j为0的情况,较复杂)

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)

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

        int result  = 0;
        if(nums1[0] == nums2[0]) dp[1][1] = 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;
                }
                result = Math.max(result, dp[i][j]);
                // System.out.print(dp[i][j] + " ");
            }
            // System.out.println();
        }
        return result;
    }
}

滚动数组

注意:
1、思路同上,只是每一层的状态是从上一层拷贝下来的,因此在遍历nums2时要从后向前,防止将前面元素在上一层的状态覆盖
2、当遇到元素不相同是要将对应位置赋值0.

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

        int result  = 0;
        for (int i=1; i<=len1; i++){
            for(int j=len2; j>=1; j--){
                if(nums1[i-1] == nums2[j-1]){
                    dp[j] = dp[j-1]+1;
                } else dp[j] = 0; // 注意这里不相等的时候要有赋0的操作
                result = Math.max(result, dp[j]);
                
            }
            
        }
        return result;
    }
}

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

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

相关文章

财务运营域——营收稽核系统设计

摘要 本文主要介绍了营收稽核系统的背景、特点与作用。营收稽核系统的产生源于营收管理复杂性、财务合规与审计需求、提升数据透明度与决策效率、防范舞弊与风险管理、技术进步与自动化需求、多元化业务模式以及跨部门协作与数据整合等多方面因素。其特点包括自动化与智能化、…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

速通HTML

目录 HTML基础 1.快捷键 2.标签 HTML进阶 1.列表 a.无序列表 b.有序列表 c.定义列表 2.表格 a.内容 b.合并单元格 3.表单 a.input标签 b.单选框 c.上传文件 4.下拉菜单 5.文本域标签 6.label标签 7.按钮标签 8.无语义的布局标签div与span 9.字符实体 HTML…

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务&#xff0c;它不仅关乎科研工作的效率&#xff0c;还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析&#xff1a; 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性&#xff0c;同时确保科…

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃&#xff0c;他背叛了暗夜精灵&#xff0c;率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀&#xff0c;被困在一个荒芜的大岛上。 为了杀死守望者&#xff0c;尤迪安开始对这个荒岛…

【算法设计与分析】(一)介绍算法与复杂度分析

【算法设计与分析】&#xff08;一&#xff09;介绍算法与复杂度分析 前言一、什么是算法&#xff1f;二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索&#xff0c;到推荐系统的个性化推荐&#xff0c;再到人工智能领域…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

OpenGL ES -> GLSurfaceView绘制点、线、三角形、正方形、圆(顶点法绘制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

基于springboot大学生学科竞赛管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 学科竞赛一直是检测学生学习能力好坏的重要手段&#xff0c;随着社会的发展&#xff0c;学科竞赛已经渗透到各个方面。但是传统方式的竞赛方式已经不能更好的胜任越来越多的需求&#xff0c;所以需要设计一个大学生学科竞赛管理系统&#xff0c;来满足日益重要的学科竞赛…

Dify私有化部署自己的AI Agent

1、下载Dify git clone gitgithub.com:langgenius/dify.git 2、创建Dify配置 进入dify目录下的docker目录中,复制.env.example为 .env 3、使用Docker命令进行部署Dify docker compose up -d 4、访问Dify http://localhost/install 5、 设置模型供应商 配置环境变量&#xff1…

【Deepseek+Browser-Use搭建 Web UI自动化】

参考文档&#xff1a;browser-use WebUI DeepSeek V3 把浏览器整成自动化了!_browser use webui 执行run agent chrome没出来-CSDN博客 1、 安装完成&#xff1a; 三、安装步骤&#xff08;适用于macOs、windows、linux&#xff09; 1、拉取WebUI项目 git clone https://gi…

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自&#xff1a;由清华大学出品的 《DeepSeek&#xff1a;从入门到精通》。 作为纯文本生成模型&#xff0c;DeepSeek虽不具备多媒体内容生成接口&#xff0c;但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作&#xff0c;最终…

解决数据库建表错误:ERROR 1064 (42000) You have an error in your SQL

[TOC](解决数据库建表错误&#xff1a;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desk tb_user’ at line 1) 运用MySQL命令运行sql语句进行建表时&am…

compare-form.vue 的 v 来源(来自父组件index.vue中的row行数据)

文章目录 compare-form.vue 的父组件compare-form.vue 的 v 来源相关代码片段1. value 的 Prop 定义2. Watch(value) 及其 watchValue 方法3. 与 value 间接相关的代码&#xff08;影响 v 的初始化或使用&#xff09; 总结 子组件 compare-form.vue父组件 index.vue 以下是关于…

【深度学习神经网络学习笔记(三)】向量化编程

向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术&#xff0c;尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…

基于 SpringBoot Vue 的生鲜商城系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

电机控制的空间矢量调制 (SVPWM)

目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM)&#xff0c;空间矢量调制 (SVPWM) 是感应电机和永磁…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk 35 三个报错信息如下 第一个 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…

Ubuntu 22.04安装K8S集群

以下是Ubuntu 22.04安装Kubernetes集群的步骤概要 一、设置主机名与hosts解析 # Master节点执行 sudo hostnamectl set-hostname "k8smaster" # Worker节点执行 sudo hostnamectl set-hostname "k8sworker1"# 所有节点的/etc/hosts中添加&#xff1a; ca…