1. 程式人生 > 其它 >C語言重構【84】柱狀圖中最大的矩形

C語言重構【84】柱狀圖中最大的矩形

技術標籤:# 演算法練習C語言版

文章目錄

所有題目原始碼:

題目

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。
求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210112234646497.png

以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]

在這裡插入圖片描述

圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。
示例:
輸入: [2,1,5,6,2,3]
輸出:
10

方案:

  • 雖然可以過,但有大問題
class Solution
{
public:
    int largestRectangleArea(vector<int> &heights)
    {
        //棧的思想
        stack<int> s;
        //哨兵1、2號
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        s.push(0);
        int len = heights.size();
        int
area = 0; int width = 0; int index; //第一遍遍歷 //當前比前一個大,前一個暫時無法判斷最大值,入棧 //當前比前一個小,前一個可以判斷最大值,出棧 for (int i = 1; i < len; i++) { while (heights[i] < heights[s.top()]) { //計算面積,彈棧 index = s.top(
); s.pop(); //彈出來的元素的len=前後倆元素的間隔,高度就是本下標的高度 width = i - index; // 這裡有優化空間,大問題 int j = index - 1; while (j > 0 && heights[j--] > heights[index]) width++; area = max(area, heights[index] * width); } s.push(i); } //最後返回最大值 return area; } };
複雜度計算
  • 時間複雜度:O(n2)
  • 空間複雜度:O(n)