import java.awt.Point; class Solution { public int maxWidthRamp(int[] A) { int N = A.length; Integer[] B = new Integer[N]; for (int i = 0; i < N; ++i) B[i] = i; // Sort index based on value Arrays.sort(B, (i, j) -> ((Integer) A[i]).compareTo(A[j])); int ans = 0; int m = N; for (int i: B) { ans = Math.max(ans, i - m); m = Math.min(m, i); } return ans; } /*public int maxWidthRamp(int[] A) { int N = A.length; int ans = 0; List candidates = new ArrayList(); candidates.add(new Point(A[N-1], N-1)); // candidates: i's decreasing, by increasing value of A[i] for (int i = N-2; i >= 0; --i) { // Find largest j in candidates with A[j] >= A[i] int lo = 0, hi = candidates.size(); while (lo < hi) { int mi = lo + (hi - lo) / 2; if (candidates.get(mi).x < A[i]) lo = mi + 1; else hi = mi; } if (lo < candidates.size()) { int j = candidates.get(lo).y; ans = Math.max(ans, j - i); } else { candidates.add(new Point(A[i], i)); } } return ans; }*/ }