A ramp in an integer array nums is a pair (i, j) for which i < j and nums[i] <= nums[j]. The width of such a ramp is j - i.
Given an integer array nums, return the maximum width of a ramp in nums. If there is no ramp in nums, return 0.
Β
Example 1:
Input: nums = [6,0,8,2,1,5]
Output: 4
Explanation: The maximum width ramp is achieved at (i, j) = (1, 5): nums[1] = 0 and nums[5] = 5.
Example 2:
Input: nums = [9,8,1,0,1,9,4,0,4,1]
Output: 7
Explanation: The maximum width ramp is achieved at (i, j) = (2, 9): nums[2] = 1 and nums[9] = 1.
Β
Constraints:
2 <= nums.length <= 5 * 104
0 <= nums[i] <= 5 * 104
Solutions
Solution 1: Monotonic Stack
According to the problem, we can find that the subsequence formed by all possible \(\textit{nums}[i]\) must be monotonically decreasing. Why is that? Let's prove it by contradiction.
Suppose there exist \(i_1<i_2\) and \(\textit{nums}[i_1]\leq\textit{nums}[i_2]\), then actually \(\textit{nums}[i_2]\) cannot be a candidate value, because \(\textit{nums}[i_1]\) is more to the left and would be a better value. Therefore, the subsequence formed by \(\textit{nums}[i]\) must be monotonically decreasing, and \(i\) must start from 0.
We use a monotonically decreasing stack \(\textit{stk}\) (from bottom to top) to store all possible \(\textit{nums}[i]\). Then we traverse \(j\) starting from the right boundary. If we encounter \(\textit{nums}[\textit{stk.top()}]\leq\textit{nums}[j]\), it means a ramp is formed at this point. We cyclically pop the top elements from the stack and update \(\textit{ans}\).
The time complexity is \(O(n)\) and the space complexity is \(O(n)\), where \(n\) represents the length of \(\textit{nums}\).