從物理學到計算機,再到硬件,再到人工智能!

藍橋杯備賽 (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);
	}
}

不能說每天拿很多時間來學習這個,畢竟還有專業課,還有一些關於硬件的學習!未來路很長,但是想想就很有意思!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章