前言
的:
给定一个整数数组
A
,坡是元组(i, j)
,其中i < j
且A[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.提示:
2 <= A.length <= 50000
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[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=mayMaxWidth){//超过理论最大值表示已经找到最大宽度坡,直接终止循环 break; } for(int j=i+1;j <= A[j]则计算宽度 maxWidth=maxWidth>=(j-i)?maxWidth:j-i;//计算最大宽度 } } } return maxWidth; }