1. 程式人生 > 實用技巧 >84. Largest Rectangle in Histogram (Solution 2)

84. Largest Rectangle in Histogram (Solution 2)

package LeetCode_84

import java.util.*

/**
 * 84. Largest Rectangle in Histogram
 * https://leetcode.com/problems/largest-rectangle-in-histogram/description/
 *
 * 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.
 * 
*/ class Solution { /* * solution 1: brute force, Time complexity:O(n^2), Space complexity:O(1) * solution 2: Stack, Time complexity:O(n), Space complexity:O(n) * */ fun largestRectangleArea(heights: IntArray): Int { var res = 0 val stack = Stack<Int>() var i
= 0 while (i < heights.size) { if (stack.isEmpty() || heights[i] >= heights[stack.peek()]) { stack.push(i) i++ } else { //calculate max when current height less than the previous one val currentIndex = stack.pop() val h
= heights[currentIndex] val w = if (stack.isEmpty()) i else i - stack.peek() - 1 res = Math.max(res, w * h) } } //handle stack is not empty situation, for example input:[1] while (stack.isNotEmpty()) { val index = stack.pop() val h = heights[index] val w = if (stack.isEmpty()) i else i - stack.peek() - 1 res = Math.max(res, w * h) } return res } }