题目描述
给定一个整数数组 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.
思路
为使得宽度尽可能大,需要使得左边点尽可能小,右边点尽可能点,因此引入以A[0]开头的递减序列,当节点与栈顶的节点满足求宽度的要求时,栈顶节点出栈,比较节点与当前栈顶的大小
C++ 代码
class Solution {
public:
int maxWidthRamp(vector<int>& A) {
stack<int> st;
int max_width = 0;
//思路还是很特别的
for (int i = 0; i < A.size(); i++) {
if (st.empty() || A[i]<A[st.top()]) {
st.push(i);
}
}
for (int i = A.size() - 1; i > 0; i--) {
while (!st.empty() && A[st.top()] <= A[i]) {
int top = st.top(); st.pop();
max_width = max(max_width, i - top);
}
}
return max_width;
}
};