算法练习之寻找Top2的升序子数组
这是一道字节跳动的面试题,还比较简单,在这里分享AC思路
寻找一个连续上升子数组的方案较为简单,使用两个指针,一个指针指向连续子数组的低位,另一个指针迭代,直到找到小于它的数为止。
可以扩展思路,在更新top1的时候,将原来top1的内容赋值给top2,这样自然就得到了top2的子数组,但是万一top2子数组在top1后面,这样做就不够了。
解决的方案是在判断当前子数组长度大于top1的长度时,更新top1,顺带更新top2,当子数组长度小于等于top1长度的时候,判断一下是否大于top2的长度,再进行更新
Java版本的实现如下,时间复杂度O(N),空间复杂度O(1)
public static void main(String[] args) {
helper(new int[]{2, 1, 4, 5, 8, 3, 7, 10, 11,12, 5});
}
public static void helper(int[] nums){
int left=0,right=1;
int maxLen=0,prevMaxLen=0;
int maxStart=0,maxEnd=0;
int secondStart=0,secondEnd=0;
while (right<nums.length){
while(right<nums.length&&nums[right-1]<nums[right]){
right++;
}
if(right-left>maxLen){
//更新第二大
prevMaxLen=maxLen;
secondStart=maxStart;
secondEnd=maxEnd;
//更新第一大
maxLen=right-left;
maxStart=left;
maxEnd=right-1;
}else if(right-left>prevMaxLen){
//更新第二大,对应着第二长度数组在第一长度数组后面的情况
prevMaxLen=right-left;
secondStart=left;
secondEnd=right-1;
}
left=right;
right++;
}
for (int i=maxStart;i<=maxEnd;i++){
System.out.print(nums[i]+"\t");
}
System.out.println();
for(int i=secondStart;i<=secondEnd;i++){
System.out.print(nums[i]+"\t");
}
}
结果输出
3 7 10 11 12
1 4 5 8