从物理学到计算机,再到硬件,再到人工智能!
蓝桥杯备赛 (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);
}
}
不能说每天拿很多时间来学习这个,毕竟还有专业课,还有一些关于硬件的学习!未来路很长,但是想想就很有意思!