算法-寻找Top2的升序子数组

算法练习之寻找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	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值