DDSA
Advertisement

962. Maximum Width Ramp

Time: O(n)
Space: O(n)

Approach

Build a decreasing-value stack of indices left-to-right; scan right-to-left popping while nums[j] >= nums[stack.top].

962.cs
C#
// Approach: Build a decreasing-value stack of indices left-to-right; scan right-to-left popping while nums[j] >= nums[stack.top].
// Time: O(n) Space: O(n)

public class Solution
{
    public int MaxWidthRamp(int[] nums)
    {
        int ans = 0;
        Stack<int> stack = new Stack<int>();

        for (int i = 0; i < nums.Length; ++i)
        {
            if (stack.Count == 0 || nums[i] < nums[stack.Peek()])
                stack.Push(i);
        }

        for (int i = nums.Length - 1; i > ans; --i)
        {
            while (stack.Count > 0 && nums[i] >= nums[stack.Peek()])
                ans = Math.Max(ans, i - stack.Pop());
        }

        return ans;
    }
}
Advertisement
Was this solution helpful?