84. Largest Rectangle in Histogram柱状图中最大的矩形

艾恩凝

个人博客  https://aeneag.xyz/ 

公众号 技术乱舞

每日一练,保持手感

2021/10/16

题目

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/

题目分析

单调栈,入栈规则从小到大

题解

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int res = 0 ,len = heights.size();
        stack<int> my_stack;
        vector<int> new_heights(len+2,0);
        for(int i = 1 ; i < len + 1 ; ++i)new_heights[i] = heights[i-1];
        for(int i = 0 ; i < len+2 ; ++i){
            while(!my_stack.empty() && new_heights[i] < new_heights[my_stack.top()]){
                int cur = my_stack.top();
                my_stack.pop();
                int cur_height = new_heights[cur];
                int left = my_stack.top();
                int right = i;
                int width = right - left - 1;
                res = max(res,cur_height*width);
            }
            my_stack.push(i);
        } 
        return res; 
    }
};

欢迎关注 #公众号:技术乱舞 一起交流

灵魂碰撞

<think>好的,我现在需要解决用户关于如何用编程语言实现柱状图算法的问题。首先,我需要明确用户的需求是什么。他们可能想要了解如何生成柱状图的数据结构,或者如何绘制柱状图的可视化效果。根据用户提到的引用内容,特别是引用[2]和[4]提到的柱状图最大矩形的问题,可能用户对算法部分更感兴趣,比如如何处理柱状图数据来解决特定问题,如计算最大面积。 接下来,我要考虑用户提供的引用材料。引用[1]和[3]提到了Python和qwt绘制柱状图的示例,这可能涉及到可视化库的使用,如Matplotlib或Plotly。而引用[2]和[4]则是关于柱状图最大矩形面积的算法,这可能涉及到单调的应用。用户的问题可能包含两部分:如何生成柱状图的数据结构以及如何实现相关算法,或者如何用编程语言绘制柱状图。 需要分情况处理。首先,解释柱状图算法的常见应用场景,比如数据统计或最大面积计算。然后,分别给出生成柱状图数据结构的示例和绘制柱状图的方法。同时,根据引用内容,可能需要提供最大矩形面积算法的实现,如使用单调的方法。 我需要确保回答结构清晰,分步骤说明。例如,首先用Python生成柱状图数据,然后展示如何用Matplotlib绘制,接着解释如何计算最大矩形面积,并提供代码示例。同时,要引用用户提供的资料,比如引用[2]和[4]提到的算法问题,并在适当的位置添加引用标识。 另外,用户可能对具体的实现细节感兴趣,比如如何处理输入数据,如何设计算法步骤,以及不同编程语言的实现差异。需要确保代码示例正确,并解释关键部分。例如,在Python中使用列表推导式生成频率数据,使用Matplotlib的bar函数绘制柱状图,以及使用结构来实现最大面积计算。 最后,生成相关问题,引导用户进一步学习,比如性能优化、不同算法的比较,或应用场景等。这些问题需要与柱状图相关,并参考用户提供的引用内容中的主题,如快速排序的优化方法可能类比到柱状图算法的优化。</think>### 柱状图算法实现解析 柱状图的核心算法可分为两类:**数据统计生成**和**基于柱状图的几何计算**(如最大矩形面积)。以下是具体实现方法: --- #### 一、柱状图数据生成算法(统计频次) **目标**:将原始数据转换为柱状图的高度数组 **示例**:统计数组$[1,3,2,3,5]$中每个数值出现的次数,生成高度数组$[1,2,2,0,1]$(假设数据范围1-5) ```python def generate_histogram(data, bin_range): min_val, max_val = bin_range bins = [0] * (max_val - min_val + 1) for num in data: if min_val <= num <= max_val: bins[num - min_val] += 1 return bins # 示例数据 data = [1,3,2,3,5] hist = generate_histogram(data, (1,5)) print(hist) # 输出: [1, 2, 2, 0, 1] ``` --- #### 二、柱状图可视化实现(Python示例) 使用Matplotlib库绘制基础柱状图[^1]: ```python import matplotlib.pyplot as plt labels = ['A', 'B', 'C', 'D', 'E'] values = [15, 24, 35, 12, 28] plt.bar(labels, values, color='skyblue') plt.title('示例柱状图') plt.xlabel('类别') plt.ylabel('数值') plt.show() ``` --- #### 三、柱状图最大矩形算法(单调) **问题描述**:在给定高度数组的柱状图中,找到能勾勒出的最大矩形面积[^2][^4] ##### 算法步骤: 1. 维护一个单调递增 2. 遍历每个柱体时计算以当前高度为矩形高度的最大宽度 3. 时间复杂度:$O(n)$ ```python def largest_rectangle_area(heights): stack = [-1] # 辅助 max_area = 0 heights.append(0) # 添加哨兵值 for i in range(len(heights)): while stack[-1] != -1 and heights[i] < heights[stack[-1]]: h = heights[stack.pop()] w = i - stack[-1] - 1 max_area = max(max_area, h * w) stack.append(i) return max_area # 示例 print(largest_rectangle_area([2,1,5,6,2,3])) # 输出10 ``` --- #### 四、进阶应用场景 1. 多色柱体显示(通过设置不同颜色映射值域)[^3] 2. 动态更新柱状图(结合动画函数实现实时更新) 3. 三维柱状图(使用mplot3d工具包) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾恩凝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值