1. 程式人生 > >求一整型陣列的嚴格單調的最長連續子序列的長度

求一整型陣列的嚴格單調的最長連續子序列的長度

求最長連續單調子序列

package adk;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class SearchMax {
	
	public static void main(String[] args) {
		
		// 模擬有50個1到100(包括1和100)的數
		int[] arr = new int[50];
		for (int i = 0; i < 50; i++) {
			arr[i] = new Random().nextInt(100) + 1;	
		}

		// 先列印一下陣列
		for (int i : arr) {
			System.out.print(i + ",");
		}
		System.out.println(); // 換行

		// 呼叫最長連續單點子序列方法
		int length = longestConMonoSubArr(arr);
		System.out.println(length);
	}

	//求陣列中最長遞增子序列
	private static int longestConMonoSubArr(int[] arr) {
		// 判斷陣列是都為空,為空返回0
		if (arr.length <= 0)
			return 0;

		int first = 0;
		int last = 0;
		int index = 0;
		// 各種長度的連續單調子序列長度,都放入集合中,一會比較出最大值;
		ArrayList<Integer> list = new ArrayList<>();
		// 1 單點遞增連續子序列的情況,沒有破壞陣列的元素順序
		for (int i = 1; i < arr.length; i++) {
			if (arr[i - 1] < arr[i]) {
				last = i;
			} else {
				index = last - first + 1; // 連續遞增中斷,記錄子序列長度
				list.add(index); // 儲存到集合中
				first = last = i; // 指標歸到i所在位置繼續
			}
		}

		// 2 單調遞減連續子序列情況
		for (int i = 1; i < arr.length; i++) {
			if (arr[i - 1] > arr[i]) {
				last = i;
			} else {
				index = last - first + 1; // 連續遞減中斷,記錄子序列長度
				list.add(index); // 也,儲存到集合中
				first = last = i; // 指標歸到i所在位置繼續
			}
		}

		Integer max = Collections.max(list); // 求出集合中的最大值,即子序列的最大值
		return max;
	}

}