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

JAVA代码编写

300.最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

进阶:

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

教程: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

方法一:动态规划

**思路:**找到最长递增子序列

五部曲:

1.定义数组dp[i]: nums中1-i索引的最长递增子序列长度为dp[i]

2.递推公式

位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。

所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3.dp数组如何初始化

dp[i]默认填充为1

4.遍历循序:从前向后

5.举例推导dp数组

输入:[0,1,0,3,2],dp数组的变化如下:

300.最长上升子序列

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:O(n)
class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1); // 初始化dp数组为1
        
        int maxLen = 1; // 记录最长递增子序列的长度
        
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            maxLen = Math.max(maxLen, dp[i]);
        }
        
        return maxLen;
    }
}

674. 最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109

教程: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

方法一:双指针

**思路:**使用start记录子序列起始位置,然后遍历,计算最大长度。

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        
        int maxLen = 1; // 记录最长连续递增子序列的长度
        int start = 0; // 记录当前连续递增子序列的起始位置
        
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > nums[i - 1]) {
                maxLen = Math.max(maxLen, i - start + 1);
            } else {
                start = i;
            }
        }
        
        return maxLen;
    }
}

方法二:动态规划

**思路:**找到最长递增子序列

五部曲:

1.定义数组dp[i]: nums中1-i索引的最长递增子序列长度为dp[i]

2.递推公式

如果前后是递增的,就dp[i] = dp[i - 1] + 1;

3.dp数组如何初始化

dp[i]默认填充为1

4.遍历循序:从前向后

5.举例推导dp数组

nums = [1,3,5,4,7]为例子

i=1 dp[1]=2 maxLen=2

i=2 dp[2]=3 maxLen=3

i=3 (默认dp[3]=1 ) maxLen=3

i=4 dp[4]=2 maxLen=3

所以最后返回3

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1); // 初始化dp数组为1
        
        int maxLen = 1; // 记录最长连续递增子序列的长度
        
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > nums[i - 1]) {
                dp[i] = dp[i - 1] + 1;
            }
            maxLen = Math.max(maxLen, dp[i]);
        }
        
        return maxLen;
    }
}

代码逻辑看着挺简单的,自己写不出来

718. 最长重复子数组

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

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。

示例 2:

输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 100

教程: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

方法一:动态规划

思路:

五部曲:

1.定义二维数组dp[i] [j]:表示以nums1[i-1]nums2[j-1]结尾的公共子数组的长度。

2.递推公式

if (nums1[i - 1] == nums2[j - 1]) {
    dp[i][j] = dp[i - 1][j - 1] + 1;
    maxLen = Math.max(maxLen, dp[i][j]);
}

3.dp数组如何初始化

默认都是0

4.遍历循序:从前向后,从上往下

5.举例推导dp数组

nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]为例子

在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:O(n)
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int[][] dp = new int[m + 1][n + 1];
        int maxLen = 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;
                    maxLen = Math.max(maxLen, dp[i][j]);
                }
            }
        }

        return maxLen;
    }


    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.findLength(new int[]{1,2,3,2,1},new int[]{3,2,1,4,7});
    }
}

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

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

相关文章

Talk | 上海交通大学魏思哲: CoBEVFlow-解决车-车/路协同感知的时序异步问题

本期为TechBeat人工智能社区第556期线上Talk。 北京时间12月14日(周四)20:00&#xff0c;上海交通大学硕士生—魏思哲的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “CoBEVFlow-解决车-车/路协同感知的时序异步问题”&#xff0c;介绍了他的团队…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年&#xff0c;Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识&#xff0c;而这些知识对旨在对用自然语言表达的高级、时…

初探栈溢出(上)

0x01 HEVD介绍 HEVD全称为HackSys Ex treme Vulnerable Drive&#xff0c;是一个项目&#xff0c;故意设计包含多种漏洞的驱动程序&#xff0c;旨在帮助安全爱好者来提升他们在内核层面的漏洞利用能力。 说白了&#xff0c;是一个内核漏洞的靶场。 项目地址&#xff1a;htt…

做数据分析为何要学统计学(10)——什么是回归分析

​回归分析&#xff08;regression analysis)是量化两种或两种以上因素/变量间相互依赖关系的统计分析方法。回归分析根据因素的数量&#xff0c;分为一元回归和多元回归分析&#xff1b;按因素之间依赖关系的复杂程度&#xff0c;可分为线性回归分析和非线性回归分析。我们通过…

没有数据线,在手机上查看电脑备忘录怎么操作

在工作中&#xff0c;电脑和手机是我最常用的工具。我经常需要在电脑上记录一些重要的工作事项&#xff0c;然后又需要在手机上查看这些记录&#xff0c;以便随时了解工作进展。但是&#xff0c;每次都需要通过数据线来传输数据&#xff0c;实在是太麻烦了。 有一次&#xff0…

探秘AI赋能的未来世界:CyberAI深度学习技术助力变革

CyberAI平台概述 随着AI技术的极速发展&#xff0c;AI能力正在助力产业加速场景化落地。CyberAI是数新网络面向开发者和企业的一站式AI数据科学平台&#xff0c;提供交互式和可视化建模服务&#xff0c;算法模型全生命周期管理。平台可帮助开发者快速开发AI应用&#xff0c;解…

全都没有问题(一)

字符指针与字符数组的区别与关系 EOF使用指北&#xff0c;南辕北辙&#xff01; #include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct LNode{char name[20];struct LNode *next; }LNode,*LinkList;int main() {char str1[20];char* …

基于若依搭建微服务nacos版本(ruoyi-Cloud)

说明&#xff1a;本文介绍基于Ruoyi-Cloud前后端分离nacos版本的微服务从0到1的搭建过程&#xff0c;是基于官方文档的补充说明&#xff0c;需要结合Ruoyi-Cloud的官方文档 https://doc.ruoyi.vip/ruoyi-cloud/ 如果直接查看官方文档便可成功部署&#xff0c;推荐直接看官方文档…

JS实现日历表

有需要的可以用一下&#xff0c;这是一个简单的demo. HTML&#xff1a; <table><thead><tr><th colspan"2"><span class"left"></span></th><th colspan"3"><span class"time"&g…

typedef的使用

在C语言中&#xff0c;有一个关键字叫做typedef&#xff0c;有些人对此感到很疑惑。不熟悉此知识的同学都会对编程失去细心&#xff0c;直接劝退&#xff08;因为之前我就是这样&#xff09;。、 因为好不容易认识了C语言中所有的关键字&#xff08;就是类型吧&#xff0c;像啥…

c语言:指针与数组

目录 使用指针访问数组 使用第一个元素获取数组首地址 使用数组名获取数组首地址 使用指针访问数组等价于下标访问 使用指针访问数组 指针类型的加减运算可以使指针内保存的首地址移动。指针类型加n后。首地址向后移动 n * 步长 字节。 指针类型减n后。首地址向前移动 n *…

Notion开源平替知识库软件AFFiNE本地部署与公网访问远程协作

文章目录 前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE5. 结语 前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署&#xff0c;并实现公网远程访问。AFFiNE 是一个全新的开源项目&#xff0c;旨…

LeetCode Hot100 148.排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head null)retur…

Linux NAPI ------------- epoll边缘触发模式

Linux处理网络数据包的一般流程 分组到达内核的时间是不可预测的。所有现代的设备驱动程序都使用中断来通知内核有分组到达。 网络驱动程序对特定于设备的中断设置了一个处理例程&#xff0c;因此每当该中断被引发时&#xff08;即分组到达&#xff09;&#xff0c;内核都调用…

【Sprin Aop基于注解简单案例之所有通知以及实现 快速复习Aop】

通知类型包括&#xff1a; ● 前置通知&#xff1a;Before 目标方法执行之前的通知 ● 后置通知&#xff1a;AfterReturning 目标方法执行之后的通知 ● 环绕通知&#xff1a;Around 目标方法之前添加通知&#xff0c;同时目标方法执行之后添加通知。 ● 异常通知&#xff1a;A…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

MyBatisPlus基础入门笔记

MyBatisPlus基础入门笔记&#xff0c;源码可见下载链接 大家阅读时可善用目录功能&#xff0c;可以提高大家的阅读效率 下载地址&#xff1a;MyBatisPlus源码笔记 初识MyBatisPlus 入门案例 SpringBoot整合MyBatis&#xff08;复习&#xff09; 创建SpringBoot工程勾选使用的…

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术&#xff0c;实时采集现场数据&#xff0c;自动分析&#xff0c;精准分析、智能决策、科学评价&#xff0c;形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案&#xff0c;提升项目部管…

每周一算法:树形动态规划

树形动态规划 树形动态规划一般用于处理求树上最优值的问题。大多数动态规划问题都是在一维二维这种规则的背景下的&#xff0c;可以解决的问题比较局限&#xff0c;而树作为一种特殊的图&#xff0c;可以描述比较复杂的关系&#xff0c;再加上树的递归定义&#xff0c;是一种…