图片.png
图片.png

方法一:枚举

思路:通过枚举的方式进行求解,可以从枚举宽和枚举高的角度来着手。

枚举宽

枚举宽,其实就是在固定宽的情况下去获取高度。矩形会由最左边的柱子和最右边的柱子去构成边界,因此这个固定的宽可通过枚举最左边的柱子和最右边的柱子来获取。值得注意的是,这个边界可以重叠,此时矩形仅由一个柱子构成。

  1. /**
  2. * @param {number[]} heights
  3. * @return {number}
  4. */
  5. var largestRectangleArea = function(heights) {
  6. const size = heights.length;
  7. let result = 0;
  8. // 从最左边的柱子开始枚举
  9. for (let i = 0; i < size; left++) {
  10. let minHeight = Infinity
  11. // 枚举最右边的柱子
  12. for (let j = left; j < size; j++) {
  13. // 获取最小高度
  14. minHeight = Math.min(minHeight, heights[j])
  15. // 获取面积
  16. const area = minHeight * (j - i + 1)
  17. // 获取最小面积
  18. result = Math.max(result, area)
  19. }
  20. }
  21. return result
  22. }

枚举高

枚举高,其实就是在固定高的情况下去获取宽。当以某个柱子的高度作为矩形的高度,此时就应该以这个柱子为中心,去找这个矩形的边界。也就是说,根据这个固定的高度,来找最左边的柱子和最右边的柱子要构成这个固定高的矩形,那么最左边和最右边的柱子,一定不能比固定高矮。根据这个条件,就可以找到矩形的最左和最右的柱子。值得注意的是,最左边的柱子和最右边的柱子会有重叠的情况,这个时候仅有一个柱子来构成这个矩形。

  1. /**
  2. * @param {number[]} heights
  3. * @return {number}
  4. */
  5. var largestRectangleArea = function(heights) {
  6. let result = 0;
  7. for (let i = 0; i < heights.length; i++) {
  8. // 矩形的高度
  9. const height = heights[i]
  10. // 最左侧柱子的索引
  11. let left = i;
  12. // 最右侧柱子的索引
  13. let right = i;
  14. // 要确保最左侧柱子的索引必须大于 0,并且它的高度必须大于等于矩形的高度
  15. while (left - 1 >= 0 && heights[left - 1] >= height) {
  16. left--;
  17. }
  18. // 要确保最右侧柱子的索引必须小于柱子的元素个数,并且它的高度必须大于等于矩形的高度
  19. while (right + 1 < heights.length && heights[right + 1] >= height) {
  20. right++;
  21. }
  22. // 求面积
  23. result = Math.max(result, height * (right - left + 1))
  24. }
  25. return result;;
  26. };

方法二