共计 1188 个字符,预计需要花费 3 分钟才能阅读完成。
前言
Weekly Contest 116 的最大宽度坡:
给定一个整数数组 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.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;
}