leetcode — largest-rectangle-in-histogram
2017-10-29 22:56
316 查看
import java.util.Stack; /** * * Source : https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ * * * Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, * find the area of largest rectangle in the histogram. * * 6 * +---+ * 5 | | * +---+ | * | | | * | | | * | | | 3 * | | | +---+ * 2 | | | 2 | | * +---+ | | +---+ | * | | 1 | | | | | * | +---+ | | | | * | | | | | | | * +---+---+---+---+---+---+ * * Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. * * * 6 * +---+ * 5 | | * +-------| * |-------| * |-------| * |-------| 3 * |-------| +---+ * 2 |-------| 2 | | * +---+ |-------|---+ | * | | 1 |-------| | | * | +---|-------| | | * | | |-------| | | * +---+---+---+---+---+---+ * * * The largest rectangle is shown in the shaded area, which has area = 10 unit. * * For example, * Given height = [2,1,5,6,2,3], * return 10. */ public class LargestRectangle { /** * 找到直方图中面积最大的矩形的面积 * * 从左向右遍历数组 * 如果当前元素大于栈顶元素,说明当前是一个递增序列,将当前元素压入栈 * 如果当前元素小于栈顶元素,则pop出栈顶元素,计算当前栈顶元素和到当前位置的面积,和最大面积比较,更新最大面积,直到栈为空 * * * 边界条件 * 为了计算第一个元素,在栈底压入0 * * @param arr * @return */ public int findLargest (int[] arr) { int result = 0; Stack<Integer> stack = new Stack<Integer>(); stack.push(0); for (int i = 0; i < arr.length; i++) { if (stack.empty() || arr[i] >= arr[stack.peek()]) { stack.push(i); } else { int cur = stack.pop(); result = Math.max(result, arr[cur] * (i - cur)); i --; } } return result; } /** * 相比于上面的方法,这里会将每一个递增序列前面所有的元素计算一遍,而不是仅仅计算当前递增序列 * * @param arr * @return */ public int findLargest1 (int[] arr) { int res = 0; for (int i = 0; i < arr.length; ++i) { if (i + 1 < arr.length && arr[i] <= arr[i + 1]) { continue; } int minH = arr[i]; for (int j = i; j >= 0; --j) { minH = Math.min(minH, arr[j]); int area = minH * (i - j + 1); res = Math.max(res, area); } } return res; } public static void main(String[] args) { LargestRectangle largestRectangle = new LargestRectangle(); int[] arr = new int[]{2,1,5,6,2,3}; int[] arr1 = new int[]{2,1,5,6,5,2,3}; // System.out.println(largestRectangle.findLargest(arr)); // System.out.println(largestRectangle.findLargest(arr1)); System.out.println(largestRectangle.findLargest1(arr1)); } }
相关文章推荐
- LeetCode力扣之Largest Rectangle in Histogram
- leetcode笔记:Largest Rectangle in Histogram
- LeetCode No.84 Largest Rectangle in Histogram 题解
- Leetcode: Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram
- LeetCode | Largest Rectangle in Histogram
- LeetCode | Largest Rectangle in Histogram
- LeetCode-Largest Rectangle in Histogram-直方图上的最大矩形-基于栈的滑动最值
- Leetcode:Largest Rectangle in Histogram
- Leetcode Largest Rectangle in Histogram
- LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram 解题报告
- leetcode Largest Rectangle in Histogram
- [LeetCode][Java] Largest Rectangle in Histogram
- (难点)[LeetCode]Largest Rectangle in Histogram
- LeetCode084 Largest Rectangle in Histogram
- [Leetcode]Largest Rectangle in Histogram
- Largest Rectangle in Histogram -- leetcode
- LeetCode_Largest Rectangle in Histogram
- [LeetCode40]Largest Rectangle in Histogram