题目要求:
分析:
采用分治法。
- 首先遍历整个heights数组,找出最小的heights[i]值,然后求出此时的面积;
- heights数组进行分治,分别求出最小heights[i]这根柱子的左边和右边的面积。这里就是利用递归了;
- 然后继续2中的步骤,直到left指针的指向大于right指针为止。
- 对所求出的面积进行比较,取最大值。其实就是比较最初求出的那个面积,以及最小值左边和右边的递归就好了。
具体代码如下:
class Solution {
public int largestRectangleArea(int[] heights) {
return calculateArea(heights, 0, heights.length - 1);
}
public int calculateArea(int[] heights, int left, int right) {
if (left > right)
return 0;
int minIndex = left;
for(int i = left; i <= right; i ++) {
if(heights[i] <= heights[minIndex])
minIndex = i;
}
int area = (right - left + 1) * heights[minIndex];
//递归
int sidesArea = Math.max(calculateArea(heights, left, minIndex - 1), calculateArea(heights, minIndex + 1, right));
return Math.max(area, sidesArea);
/*int leftArea = calculateArea(heights, left, minIndex - 1);
int rightArea = calculateArea(heights, minIndex + 1, right);
return Math.max(area, Math.max(leftArea, rightArea));*/
}
}
注释的那部分是我原本写的,可是这样写提交的时候会超出时间限制,所以我把它们给合并到一起了。性能不太好,但是时间复杂度应该算是可以了,好在也通过了。晕……