LeetCode——动态规划篇(六)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com

目录

[300. 最长递增子序列 - 力扣(LeetCode)](#300. 最长递增子序列 - 力扣(LeetCode))

[674. 最长连续递增序列 - 力扣(LeetCode)](#674. 最长连续递增序列 - 力扣(LeetCode))

[718. 最长重复子数组 - 力扣(LeetCode)](#718. 最长重复子数组 - 力扣(LeetCode))


300. 最长递增子序列 - 力扣(LeetCode)

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

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

java 复制代码
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 
java 复制代码
import java.util.Arrays;

/**
 * @author light
 * @Description 最长递增子序列
 *
 *
 * (思路:数组中只要有递增的就行,无需连续
 * 动态规划--弄明白dp数组所表示的含义
 * dp[i]:nums[i]之前(包括nums[i])的字序列最大递增子序列长度为dp[i]
 * @create 2023-10-15 9:50
 */
public class LengthOfLISTest {
	public static void main(String[] args) {
		int[] nums={0,1,0,3,2};
		System.out.println(lengthOfLIS(nums));
	}

	public static  int lengthOfLIS(int[] nums) {

		int[] dp=new int[nums.length];
		Arrays.fill(dp, 1);//初始化

		int result=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);
			}
			if (dp[i] > result) result = dp[i]; // 取长的子序列
		}
		return result;
	}
}

674. 最长连续递增序列 - 力扣(LeetCode)

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

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

java 复制代码
import java.util.Arrays;

/**
 * @author light
 * @Description  最长连续递增的子序列

 * (思路:只需考虑nums[i]和nums[i-1]
 * @create 2023-10-15 10:49
 */
public class FindLengthOfLCISTest {

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

718. 最长重复子数组 - 力扣(LeetCode)

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

java 复制代码
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
java 复制代码
/**
 * @author light
 * @Description 最长重复子数组
 *
 * 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
 *
 * (思路:搞清dp数组含义
 * dp[i][j]:以i-1为结尾的数组nums1和以j-1为结尾的数组nums2的最长重复子数组长度为dp[i][j]
 * 比以i,j为结尾的好处:简化了dp数组的初始化;使得dp[i][0]和dp[0][j]没有意义
 * @create 2023-10-15 13:38
 */
public class FindLengthTest {
	public int findLength(int[] nums1, int[] nums2) {
		//dp[i][j]:以i-1为结尾的数组nums1和以j-1为结尾的数组nums2的最长重复子数组长度为dp[i][j]
		int[][] dp=new int[nums1.length+1][nums2.length+1];
		int res=0;
		for (int i = 1; i <=nums1.length; i++) {
			for (int j = 1; j <=nums2.length; j++) {
				if(nums1[i-1]==nums2[j-1]){
					dp[i][j]=dp[i-1][j-1]+1;
				}
				res= Math.max(dp[i][j],res);
			}
		}
		return res;
	}
}
相关推荐
番茄去哪了9 小时前
神领物流面试题(一)
java·大数据·中间件
云烟成雨TD9 小时前
Agent Scope Java 2.x 系列【9】接入高德 MCP 服务
java·人工智能·agent
不知名的老吴9 小时前
经典算法题之行星碰撞
数据结构·算法
gaohe26AIliuzeyu9 小时前
Java内部类
java·开发语言
西安邮电大学9 小时前
有关数组的经典算法题
java·后端·其他·算法·面试
互联网推荐官9 小时前
上海AI Agent智能体开发公司技术选型实录:六条路径、三类架构与真实落地约束
java·人工智能·ai·架构·开发经验·上海
学Linux的语莫9 小时前
大模型微调数据集格式详解:Alpaca、ShareGPT、DPO、KTO、预训练数据怎么构建?
人工智能·算法·机器学习·微调格式
wayz119 小时前
Momentum:UO(终极震荡指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
mikasa6679 小时前
关于Spring MVC 基于 AOP 实现的全局控制器统一处理方案@ControllerAdvice
java·spring·mvc
一 乐9 小时前
幼儿园管理系统|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·幼儿园管理系统