397. 最长上升连续子序列

本文详细解析了蓝桥杯竞赛中一道关于寻找数组中最长上升连续子序列的问题,通过实例展示了如何使用动态规划思想解决这一挑战,并提供了JAVA实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从物理学到计算机,再到硬件,再到人工智能!
蓝桥杯备赛 (LintCode上刷的第二题)

问题描述

给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)

样例输出

给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回 4.

给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4], 返回 4.

问题分析

一看到这个题目,最长上升连续子序列,与之前自己学过的最长上升子序列不过是多了两个字,于是想用哈希表求解。等自己凭着记忆敲完了代码,发现要连续的,连续的,连续的!!!哈希表是不会记录数组元素顺序的,于是我还是用了最简单的数组进行记录最长上升连续子序列。这道题动态规划的思想并不是特别强。
现在的思路比较chuo。我建立了两个数组dpM和dpm,分别记录从左至右和从右至左的最长上升连续子序列。然后依次遍历数组的各个元素,如果当前元素大于dpM的最后一个元素,则将其加入dpM;如果当前元素小于dpm的最后一个元素,则将其加入dpm。
此题思路是真的很简单了!!!

JAVA实现代码

package DP;

import javax.imageio.metadata.IIOInvalidTreeException;

public class LICS397_1111 {
	
	/**
	 * 求一个数组的最长连续子序列的长度,可以从左至右或从右至左
	 * @param arr  传入的数组
	 * @return
	 */
	public static int LICS(int[] arr) {
		//判断数组的有效性
		if (arr == null || arr.length == 0) {
			return 0;
		}
		//max,min记录最长连续子序列的长度
		int max = 1;
		int min = 1;
		//创建一个数组记录升序的连续上升子序列
		int[] dpM = new int[arr.length];
		//创建一个数组记录降序的连续上升子序列
		int[] dpm = new int[arr.length];
		//赋初值
		dpM[0] = arr[0];
		dpm[0] = arr[0];
		for (int i  = 1; i  < arr.length; i ++) {
			//当前元素大于dpM中的最后一个元素,则将当前元素添加进数组
			if (arr[i] > dpM[i]) {
				dpM[i] = arr[i];
				max = i;
			}
			//当前元素大于dpm中的最后一个元素,则将当前元素添加进数组
			if (arr[i] < dpm[i]) {
				dpm[i] = arr[i];
				min = i;
			}
		}
		return min > max ? min : max;
	}
	
	public static void main(String[] args) {
		int[] arr = new int[5];
//		arr[0] = 5; arr[1] = 4; arr[2] = 2;
//		arr[3] = 1; arr[4] = 3;
		
		arr[0] = 5; arr[1] = 1; arr[2] = 2;
		arr[3] = 3; arr[4] = 4;
		int result = LICS(arr);
		System.out.println(result);
	}
}

不能说每天拿很多时间来学习这个,毕竟还有专业课,还有一些关于硬件的学习!未来路很长,但是想想就很有意思!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值