这是一道智力题,我还会再次好好做这个的
一个很好的参考:点击打开链接
/**
* @param height: A list of integer
* @return: The area of largest rectangle in the histogram
*/
public int largestRectangleArea(int[] height) {
int max = 0;
if (height == null || height.length < 1) {
return max;
}
Stack<Integer> stack = new Stack<>();
int i = 0;
int[] newHeight = new int[height.length + 1];
for (int j = 0; j< height.length; j++) {
newHeight[j] = height[j];
}
newHeight[height.length] = 0;
while (i < newHeight.length) {
// if (i == height.length) {
// int t = stack.pop();
// max = Math.max(max, height[t] * (stack.isEmpty() ? i : i - stack.peek() - 1));
// break;
// }
if (stack.isEmpty() || newHeight[stack.peek()] < newHeight[i]) {
stack.push(i);
i++;
} else {
int t = stack.pop();
max = Math.max(max, newHeight[t] * (stack.isEmpty() ? i : i - stack.peek() - 1));
}
}
return max;
}
// public int largestRectangleArea(int[] height) {
// int max = 0;
// //2 if (height == null || height.length < 2) {
// if (height == null || height.length < 1) {
// return max;
// }
// for (int i = 0; i < height.length; i++) {
// int h = height[i];
// for (int j = i; j < height.length; j++) {
// //1 if (height[i] > height[j]) {
// if (h > height[j]) {
// h = height[j];
// }
// int width = j - i + 1;
// max = Math.max(max, width*h);
// }
// }
// return max;
// }