寻找最长的递增子序列

例:(1,9,2,5,7,3,4,6,8,0) 最长子序列为(3,4,6,8)
    (1,9,2,5,7,7,8,6,8,0)最长子序列为(2,5,7)
  public static void main(String[] args) {
        int arr[] = new int[]{1,9,2,5,7,3,4,6,8,0};
        maxArr(arr);
    }
    private static void maxArr(int[] arr){

        int[] helper = new int[10];//开辟长度为10的辅助空间
        int p = 0;// 定义p 用于定位
        int q = 0;// 定义q 用于移动

        while (p <= q && q < arr.length - 1) {
            if (arr[q] < arr[q + 1]) { // 若后一位比前一位大
                q++; // q接着往后移动
            } else { //  若后一位比前一位小 停止移动
                helper[p] = q - p + 1; //以p作为数组下标存放各递增序列长度
                p++;
                q = p; //从新的起点开始
            }
        }

        //开始找最长的
        int maxl = 0;
        for (int i = 0; i < helper.length - 1; i++) { //进行遍历
            maxl = Math.max(maxl, helper[i]); // 层层比较 获取最长的子序列数
        }

        //找到了maxl 开始遍历输出
        for (int i = 0; i < helper.length - 1; i++) { //遍历helper辅助数组
            if (helper[i] == maxl) { //确定长度最长的子序列
                while (maxl > 0) { //按 maxl的长度输出序列数个数
                    System.out.print(arr[i]+" ");  //输出最长序列数
                    i++; //找最长子序列的长度
                    maxl--;
                }
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值