题解 | 牛舍的占地面积
牛舍的占地面积
https://www.nowcoder.com/practice/4d9d9bf23d874688aee6fc1ac5bf6902
单调递增栈中。
- 当前元素压栈时,上一个元素是该元素向前找的第一个小值。
- 当前元素出栈时,与其做比较的元素是该元素向后找的第一个小值。
- 遍历结束后,因为所有元素都经历了压栈。所以向前找的第一个小值都已经知道(无论是不是边界哦)。当前栈中元素的右边第一个小值都是后边界。
import java.util.*; public class Solution { public int maxArea(int[] areas) { final int n = areas.length; if (n == 0) { return 0; } int[] l = new int[n]; int[] r = new int[n]; Deque<Integer> stack = new ArrayDeque<>(); for (int i = 0; i < n; ++i) { while (!stack.isEmpty() && areas[stack.getLast()] >= areas[i]) { r[stack.removeLast()] = i; } if (stack.isEmpty()) { l[i] = -1; } else { l[i] = stack.getLast(); } stack.addLast(i); } while (!stack.isEmpty()) { r[stack.removeLast()] = n; } int ans = 0; for (int i = 0; i < n; i++) { ans = Math.max(ans, (r[i] - l[i] - 1) * areas[i]); } return ans; } }