当前位置: 首页 > news >正文

85. 最大矩形

题目描述

给定一个仅包含 01 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

在这里插入图片描述

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。

示例 2:

输入:matrix = []
输出:0

示例 3:

输入:matrix = [["0"]]
输出:0

示例 4:

输入:matrix = [["1"]]
输出:1

示例 5:

输入:matrix = [["0","0"]]
输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 1 <= row, cols <= 200
  • matrix[i][j]'0''1'

解答

class Solution {
public:int maximalRectangle(vector<vector<char>>& matrix) {// 利用 84.柱状图中最大的矩形的思路// 在每一行最左边建立一个坐标轴,每列连续1的数量就是矩形高度// 就可以转换为求柱状图中最大的矩形if(matrix.size() == 0){return 0;}vector<int> heights(matrix[0].size());int maxArea;// 每一行都求一次最大矩形for(int row = 0; row < matrix.size(); row++){// 求出某一行每列的高度for(int col = 0; col < matrix[0].size(); col++){if(matrix[row][col] == '1'){heights[col] += 1;}else // 同一列1不连续,高度重置为1{heights[col] = 0;}}maxArea = max(maxArea, largestRectangleArea(heights));}return maxArea;}// 求每行的最大矩形int largestRectangleArea(vector<int> &heights){int maxArea = 0;stack<int> st;int p = 0;while(p < heights.size()){// 栈空入栈if(st.empty()){st.push(p);p++;}else {int top = st.top();// 当前高度大于栈顶入栈// 保证栈顶到栈底降序if(heights[p] >= heights[top]){st.push(p);p++;}else // 当前高度小于小于栈顶对应的右边界,出栈{int height = heights[st.top()];st.pop();// 左边第一个小于当前柱子的下标int left = st.empty() ? -1 : st.top();// 右边第一个小于当前柱子的下标int right = p;maxArea = max(maxArea, (right - left - 1) * height);}}}// 【左边界】从【右往左】扩展进行判断是否得到最大矩形while(!st.empty()) // 柱状图完全递增的情况{int height = heights[st.top()];st.pop();// 左边第一个小于当前柱子下标int left = st.empty() ? -1 : st.top();// 右边没有小于当前高度的柱子int right = heights.size();maxArea = max(maxArea, (right - left - 1) * height);}return maxArea;}
};
http://www.lryc.cn/news/116348.html

相关文章:

  • Vue [Day5]
  • 备战大型攻防演练,“3+1”一套搞定云上安全
  • 网络_每日一学——网络的整体概述
  • 【ChatGPT 指令大全】怎么使用ChatGPT来帮我们写作
  • Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题
  • SSRF(服务器端请求伪造)漏洞
  • 【Axure动态面板】利用动态面板实现树形菜单的制作
  • Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载
  • 使用MethodInterceptor和ResponseBodyAdvice做分页处理
  • WEB集群——LVS-DR 群集、nginx负载均衡
  • 倒计时87天!软考初级信息处理技术员2023下半年报名考试攻略
  • 【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建SpringSecurity权限框架
  • c语言每日一练(4)
  • VB字符转换
  • 【C++进阶之路】map与set的基本使用
  • 代码随想录算法训练营day56
  • 通话降噪算法在手机和IOT设备上的应用和挑战
  • Pet Detection System (PDS)
  • 【OpenCV常用函数:颜色空间转换、阈值化】cv2.cvtColor()+cv2.threshold()
  • 一键登录和短信验证登录,到底有什么区别?
  • 史上最精简Android RecyclerView实现拖拽排序改变位置代码
  • centos 7 系统上重启 mysql 时报错 Failed to restart mysqld.service: Unit not found.
  • 时间复杂度空间复杂度相关练习题
  • Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程
  • Mermaid语法使用
  • [OnWork.Tools]系列 05-系统工具
  • SOME/IP学习笔记1
  • Effective Java笔记(26)请不要使用原生态类型
  • linux 内存 - KO内存占用
  • 2023.8.7论文阅读