代碼隨想錄算法訓練營|第六十三天|84.柱状图中最大的矩形。刷题心得(c++)

目录

讀題

84.柱状图中最大的矩形

看完代码随想录之后的想法

84.柱状图中最大的矩形 - 實作

思路

單調棧橫向運算思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料


讀題

84.柱状图中最大的矩形

看完代码随想录之后的想法

看完之後才知道為甚麼要接在接雨水的後面,整體的性質沒有差多少,但是就是反過來以及高度的計算上改為直接取當前最高的數值,但有一個操作很驚豔,就是前後加上0,因為在這題當中因為要取矩形所以要有前後的值進行計算,如果沒有這個前後加零的處理,就會需要再程式碼裡加上特殊處理,而前後加上0,就有點像是鏈表當中的虛頭節點一樣,加上之後就可以對於題目進行一致性的處理。

84.柱状图中最大的矩形 - 實作

思路

單調棧橫向運算思路

  1. 數組前後加上0
  2. 單調棧存放元素為數組下標
  3. 單調棧性質為遞減
  4. 當前元素對應的数組值與棧頂元素對應的数組值比較與處理
    1. 大於
      1. 將當前元素放入棧頂
    2. 等於
      1. pop棧頂元素
      2. 將當前元素放入棧頂
      3. 因為相等的話,如果比較最小值時,當前元素與棧頂元素相減 = 0 無論如何相乘都只會是0
    3. 小於
      1. 儲存棧頂元素
      2. pop棧頂
      3. 高度是
        1. 儲存棧頂元素的高
      4. 寬度是
        1. 當前元素減去目前棧頂元素再減去1
      5. result = max (h * w, result) 取最大
      6. 儲存當前元素到單調棧中
  5. return result.

Code

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        st.push(0);
        int result = 0;
        for(int i = 1; i < heights.size(); i++) {
            if(heights[i] > heights[st.top()]){
                st.push(i);
            } else if (heights[i] == heights[st.top()]) {
                st.pop();
                st.push(i);
            } else {
                while(!st.empty() && heights[i] < heights[st.top()]) {
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()) {
                        int h = heights[mid];
                        int right = st.top();
                        int left = i;
                        int w = left - right - 1;
                        result = max(h * w, result);
                    }
                }
                st.push(i);
            }
        }
        return result;
    }
};

總結

自己实现过程中遇到哪些困难

今天自己在想的時候沒有想出來,但是看完影片過後才豁然開朗,以及沒有想到前後加零的操作是如此方便,還需要對這些題目再進行了解與練習才行。

今日收获,记录一下自己的学习时长

今天大概學習1hr,主要是理解單調遞減以及怎麼去實現。

相關資料

● 今日学习的文章链接和视频链接

●  84.柱状图中最大的矩形

https://programmercarl.com/0084.柱状图中最大的矩形.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值