Maximum Width Ramp

medium array stack monotonic stack

Problem

A ramp is a pair (i, j) with i < j and nums[i] ≤ nums[j]. Return the largest j − i over all ramps.

Inputnums = [6,0,8,2,1,5]
Output4
Decreasing stack of left-candidates, scan from the right popping when allowed.

def maxWidthRamp(nums):
    st = []
    for i, x in enumerate(nums):
        if not st or nums[st[-1]] > x:
            st.append(i)
    best = 0
    for j in range(len(nums) - 1, -1, -1):
        while st and nums[st[-1]] <= nums[j]:
            best = max(best, j - st.pop())
    return best
function maxWidthRamp(nums) {
  const st = [];
  for (let i = 0; i < nums.length; i++) {
    if (st.length === 0 || nums[st[st.length - 1]] > nums[i]) st.push(i);
  }
  let best = 0;
  for (let j = nums.length - 1; j >= 0; j--) {
    while (st.length && nums[st[st.length - 1]] <= nums[j]) best = Math.max(best, j - st.pop());
  }
  return best;
}
class Solution {
    public int maxWidthRamp(int[] nums) {
        Deque<Integer> st = new ArrayDeque<>();
        for (int i = 0; i < nums.length; i++)
            if (st.isEmpty() || nums[st.peek()] > nums[i]) st.push(i);
        int best = 0;
        for (int j = nums.length - 1; j >= 0; j--)
            while (!st.isEmpty() && nums[st.peek()] <= nums[j]) best = Math.max(best, j - st.pop());
        return best;
    }
}
int maxWidthRamp(vector<int>& nums) {
    vector<int> st;
    for (int i = 0; i < (int)nums.size(); i++)
        if (st.empty() || nums[st.back()] > nums[i]) st.push_back(i);
    int best = 0;
    for (int j = (int)nums.size() - 1; j >= 0; j--)
        while (!st.empty() && nums[st.back()] <= nums[j]) { best = max(best, j - st.back()); st.pop_back(); }
    return best;
}
Time: O(n) Space: O(n)