藍橋杯備賽 (LintCode上刷的第二題)
397. 最長上升連續子序列
問題描述
給定一個整數數組(下標從 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);
}
}
不能說每天拿很多時間來學習這個,畢竟還有專業課,還有一些關於硬件的學習!未來路很長,但是想想就很有意思!