前言
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;}