LeetCode: Maximum Width Ramp Posted on June 18, 2019July 26, 2020 by braindenny Maximum Width Ramp Similar Problems: CheatSheet: Leetcode For Code Interview CheatSheet: Common Code Problems & Follow-ups Tag: #binarysearch, #monotone Given an array A of integers, a ramp is a tuple (i, j) for which i < j and A[i] <= A[j]. The width of such a ramp is j – i. Find the maximum width of a ramp in A. If one doesn’t exist, return 0. Example 1: Input: [6,0,8,2,1,5] Output: 4 Explanation: The maximum width ramp is achieved at (i, j) = (1, 5): A[1] = 0 and A[5] = 5. Example 2: Input: [9,8,1,0,1,9,4,0,4,1] Output: 7 Explanation: The maximum width ramp is achieved at (i, j) = (2, 9): A[2] = 1 and A[9] = 1. Note: 2 <= A.length <= 50000 0 <= A[i] <= 50000 Github: code.dennyzhang.com Credits To: leetcode.com Leave me comments, if you have better ways to solve. Solution: // https://code.dennyzhang.com/maximum-width-ramp // Basic Ideas: monotone stack + binarysearch // // For each j, find i. // Value vs location // // Complexity: Time O(n*log(n)), Space O(n) func maxWidthRamp(A []int) int { res := 0 stack := []int{} for i, v := range A { if len(stack) == 0 || A[stack[len(stack)-1]] > v { stack = append(stack, i) } left, right := 0, len(stack)-1 // F, F, F, T, T, T for left<right { mid := (right-left)/2+left if A[stack[mid]] <= v { right = mid } else { left = mid+1 } } if i-stack[left] > res { res = i-stack[left] } } return res } Post Views: 0