【蓝桥杯】找出最长连续递增子序列(部分有序)

题目:找出最长连续递增子序列(部分有序)

  例如{1,9,2,5,7,3,4,6,6,7,8,9}的最长递增子序列为{3,4,6,6,7,8,9}

  解题思路:

    1.分析题意:

      在序列连续,递增,部分有序的情况下,求最长的部分(相当于是锯齿数组)

    2.设计方法:

      设置“双指针”,一个表示连续递增子序列的起始位置begin,另一则表示结束位置end;

      end向前走,begin不动,直到不满足递增条件,更新begin,重复该步骤(有重复就说明要循环);

      此时就要想结束条件(即出口)是什么?递增则表示前一个元素小于后一个元素,即  arr[end]>=arr[end-1];

      因为还要输出连续子序列是什么,所以需要记住begin,end,方便后面输出序列

    3.测试边界

      对于数组,不能越界end <=arr.length-1 ;

      这里认为序列中有相等的值也是连续子序列,arr[end]>=arr[end-1],所以这里有等号;

      更新长度,len = end - begin;

      (这里不是  len = (end - begin)+1;的原因:

      在上一步循环中,end有加过1,不满足条件才执行的下一步;)

 

 1 public class findLengthSub {
 2     public static void main(String[] args) {
 3         int []arr={1,9,2,5,7,3,4,6,6,7,8,9};
 4         int res=maxLen(arr);
 5         System.out.print(res);
 6     }
 7 
 8     private static int maxLen(int[] arr) {
 9         int begin=0;
10         int end=0;
11         int len=0;
12         //输出的最长连续递增子序列的开始下标;
13         int newbegin=0;
14         int newend=0;
15         //外层循环控制序列块能一直向前移动,直至不满足条件退出,这样才能的到最长的子序列
16         while(end <=arr.length-1){
17             //出口:后一个元素小于前一个元素,即不递增,此时退出内循环;
18             while(end <=arr.length-1&&((begin==end) || (arr[end]>=arr[end-1]))){
19                 end++;
20             }
21             //更新最长连续递增子序列,将该段最长的开始下标和结束下标记住,以便输出序列;
22             if(len < end-begin){
23                 len = end - begin;
24                 newbegin=begin;
25                 newend=end-1;
26             }
27             begin=end;
28         }
29         //打印最长连续递增子序列;
30         for(int i=newbegin;i<= newend;i++){
31             System.out.print(arr[i]+"  ");
32         }
33         System.out.println();
34         return len;
35     }
36 }

  

该类问题仍在持续更新中……

posted on 2020-05-31 18:24  丁不煮  阅读(439)  评论(0)    收藏  举报

导航