962-最大宽度坡

前言

Weekly Contest 116最大宽度坡

给定一个整数数组 A,坡是元组 (i, j),其中 i < jA[i] <= A[j]。这样的坡的宽度为 j - i

找出 A 中的坡的最大宽度,如果不存在,返回 0

示例1:

输入:[6,0,8,2,1,5]
输出:4
解释:
最大宽度的坡为 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5.

示例2:

输入:[9,8,1,0,1,9,4,0,4,1]
输出:7
解释:
最大宽度的坡为 (i, j) = (2, 9): A[2] = 1 且 A[9] = 1.

提示:

  1. 2 <= A.length <= 50000
  2. 0 <= A[i] <= 50000

解题思路

本题中的元组个人感觉是一个烟雾弹,就算不了解元组的概念也能够完成本题。本题的逻辑虽然不复杂,但是如果只是按照逻辑实现,会出现Time Limit Exceeded的情况,需要在实现的代码上进行算法的优化,减少循环次数从而避免 Time Limit Exceeded

本题的逻辑实现其实很简单,使用双指针法即可完成。
首先第一个指针有序的遍历每个元素,当第一个指针指向一个元素时,第二个指针则遍历这个元素后的每一个元素,并依次与第一个指针指向的元素进行比较,如果值比它小,则计算坡度并与当前最大坡度进行比较,记录较大值。

实现代码

逻辑实现

这个代码是根据题意实现的基础代码,会出现Time Limit Exceeded的情况

    public int maxWidthRamp(int[] A) {
        //最大宽度
        int maxWidth=0;
        for(int i=0;i<A.length-1;i++){
            for(int j=i+1;j<A.length;j++){
                if(A[i]<=A[j]){//比较两个指针指向的元素值,满足A[i] <= A[j]则计算宽度
                    maxWidth=maxWidth>=(j-i)?maxWidth:j-i;//计算最大宽度
                }
            }
        }
        return maxWidth;
    }

算法优化

    /**
     * 962. 最大宽度坡
     * @param A
     * @return
     */
    public int maxWidthRamp(int[] A) {
        //最大宽度
        int maxWidth=0;
        //理论最大宽度
        int mayMaxWidth=0;
        for(int i=0;i<A.length-1;i++){
            //每次循环时,理论最大宽度应该不会超过数组最后一个元素的索引减去当前元素索引
            mayMaxWidth=A.length-1-i;
            if(maxWidth>=mayMaxWidth){//超过理论最大值表示已经找到最大宽度坡,直接终止循环
                break;
            }
            for(int j=i+1;j<A.length;j++){
                if(A[i]<=A[j]){//比较两个指针指向的元素值,满足A[i] <= A[j]则计算宽度
                    maxWidth=maxWidth>=(j-i)?maxWidth:j-i;//计算最大宽度
                }
            }
        }
        return maxWidth;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值