【蓝桥杯】找出最长连续递增子序列(部分有序)
题目:找出最长连续递增子序列(部分有序)
例如{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 }

该类问题仍在持续更新中……
浙公网安备 33010602011771号