C语言重构【84】柱状图中最大的矩形

港控/mmm° 2023-01-05 14:18 243阅读 0赞

文章目录

        • 所有题目源代码:
        • 题目
        • 方案:
          • 复杂度计算

所有题目源代码:

  • Git地址

题目

  1. 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1
  2. 求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述

  1. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

在这里插入图片描述

  1. 图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
  2. 示例:
  3. 输入: [2,1,5,6,2,3]
  4. 输出: 10

方案:

  • 虽然可以过,但有大问题

    class Solution
    {
    public:

    1. int largestRectangleArea(vector<int> &heights)
    2. {
    3. //栈的思想
    4. stack<int> s;
    5. //哨兵1、2号
    6. heights.insert(heights.begin(), 0);
    7. heights.push_back(0);
    8. s.push(0);
    9. int len = heights.size();
    10. int area = 0;
    11. int width = 0;
    12. int index;
    13. //第一遍遍历
    14. //当前比前一个大,前一个暂时无法判断最大值,入栈
    15. //当前比前一个小,前一个可以判断最大值,出栈
    16. for (int i = 1; i < len; i++)
    17. {
    18. while (heights[i] < heights[s.top()])
    19. {
    20. //计算面积,弹栈
    21. index = s.top();
    22. s.pop();
    23. //弹出来的元素的len=前后俩元素的间隔,高度就是本下标的高度
    24. width = i - index;
    25. // 这里有优化空间,大问题
    26. int j = index - 1;
    27. while (j > 0 && heights[j--] > heights[index])
    28. width++;
    29. area = max(area, heights[index] * width);
    30. }
    31. s.push(i);
    32. }
    33. //最后返回最大值
    34. return area;
    35. }

    };

复杂度计算
  • 时间复杂度:O(n2)
  • 空间复杂度:O(n)

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读