java最长上升连续子序列(LICS)

来源:互联网 发布:云计算概念股 编辑:程序博客网 时间:2024/06/15 05:39

题目

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

样例

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

分析:
首先从左到右的上升序列来说,使用队列来装从小到大的连续子序列,一旦不满足从小到大,就记录队列的长度为max,然后清空
队列,重新开始装从小到大的连续子序列,一旦不满足,就获取队列的长度和max进行比较,获取最大的赋值给max,知道遍历完所有元素。

从右到左可以看做最长下降子序列,原理类似。

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class n12LICS {    public static int[] a;    public static void main(String[] args) {        Scanner input=new Scanner(System.in);        int N=input.nextInt();        if(N<=0){            return;        }        a=new int[N];        for(int i=0;i<N;i++){            a[i]=input.nextInt();        }        int[] c=getLics(a);        System.out.printf("up:%d  down:%d",c[0],c[1]);    }    public static int[] getLics(int[] a){        if(a.length<=0){            return new int[]{0,0};        }        int max1=0;//上升        int max2=0;//下降        Queue<Integer> q1=new LinkedList<Integer>();        q1.offer(a[0]);        Queue<Integer> q2=new LinkedList<Integer>();        q2.offer(a[0]);        for(int i=1;i<a.length;i++){            if(a[i]<a[i-1]){                if(q1.size()>max1){                    max1=q1.size();                    q1.clear();                }            }            q1.offer(a[i]);            if(a[i]>a[i-1]){                if(q2.size()>max2){                    max2=q2.size();                    q2.clear();                }            }            q2.offer(a[i]);        }        if(q1.size()>max1){            max1=q1.size();            q1.clear();        }        if(q2.size()<max2){            max2=q2.size();            q2.clear();        }        return new int []{max1,max2};       }}