给定一个整数数组 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
首先,我们先从后向前遍历数组,构建一个越靠近栈顶越大的栈,之后从前向后遍历数组,如果遍历到的数字比栈顶数字小,就将当前坡的宽度作为可能的答案:
cpp
class Solution {
public:
int maxWidthRamp(vector<int>& nums) {
stack<int> stk;
for (int i = nums.size() - 1; i >= 0; --i) {
if (stk.empty() || nums[i] >= nums[stk.top()]) {
stk.push(i);
}
}
int ans = 0;
for (int i = 0; i < nums.size(); ++i) {
while (!stk.empty() && nums[i] <= nums[stk.top()]) {
ans = max(ans, stk.top() - i);
stk.pop();
}
if (stk.empty()) {
break;
}
}
return ans;
}
};
如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(n)。