首页 > 其他分享 >85. 最大矩形

85. 最大矩形

时间:2024-11-11 15:09:38浏览次数:1  
标签:wid 最大 nums int 矩阵 st ans 矩形 85

  1. 题目链接

  2. 解题思路

    • 暴力怎么做?我们可以枚举,

      • 矩阵的底,必须是第0行,求一个最大值,矩阵的底,必须是第1行,求一个最大值,把所有的都得到,然后最大的那个,就是结果。
      • 依次类推,所有结果的最大值,就是全局最优解
    • 举个例子,假设矩阵

      [
      	[1, 0, 1, 0, 0],
      	[1, 0, 1, 1, 1],
      	[1, 1, 1, 1, 1],
      	[1, 0, 0, 1, 0]
      ]
      
      • 怎么求矩阵必须是以第3行为底的最大值?这里用到「二维矩阵」压缩成「一维数组」的技巧,矩阵必须是以第3行为底,原来的矩阵,变成[4, 0, 0, 3, 0],这咋来的?从第三行往前面看,每一列,最多有多少个连续的1。
      • 然后一维数组上,求84. 柱状图中最大的矩形
      • 为啥这样就是正确的?因为二维矩阵变一维数组的过程,其实就是规定了结果的「高」,然后一维数组上求「柱状图中最大的矩形」,就是规定了结果的「宽」。
  3. 代码

    class Solution {
    public:
    
        // 一维数组,求「柱状图中最大的矩形」
        int process(vector<int> &nums) {
            stack<int> st;   // 存下标    栈底到栈顶是  小到大
            int n = nums.size();
            int ans = 0;
            for (int i = 0; i < n; ++i) {
                while(!st.empty() && nums[i] < nums[st.top()]) {
                    int wid_right = i;
                    int wid_left = 0;
                    int height = nums[st.top()];
                    st.pop();
                    if (!st.empty()) {
                        wid_left = st.top() + 1;
                    }
                    ans = max(ans, (wid_right - wid_left) * height);
                }
                st.push(i);
            }
            while(!st.empty()) {
                int wid_right = n;
                int wid_left = 0;
                int height = nums[st.top()];
                st.pop();
                if (!st.empty()) {
                    wid_left = st.top() + 1;
                }
                ans = max(ans, (wid_right - wid_left) * height);
            }
            return ans;
        }
        
        int maximalRectangle(vector<vector<char>>& matrix) {
            int m = matrix.size();
            int n = matrix[0].size();
            vector<vector<int>> tmp(m, vector<int>(n, 0));
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (matrix[i][j] == '1') {
                        tmp[i][j] = 1;
                        if (i > 0) {
                            tmp[i][j] += tmp[i - 1][j];
                        }
                    }
                    
                }
            }
            int ans = 0;
            for (int i = 0; i < m; ++i) {
                int res = process(tmp[i]);
                ans = max(ans, res);
            }
            return ans;
        }
    };
    
    

标签:wid,最大,nums,int,矩阵,st,ans,矩形,85
From: https://www.cnblogs.com/ouyangxx/p/18539743

相关文章

  • 84. 柱状图中最大的矩形
    题目链接解题思路:题目乍一看没有思路,那我们来想一想如果暴力求解怎么办。最大的矩形,他总有一个高(竖着的),然后有一个宽(横着的),那我们就暴力求解每一个高,也就是每一个下标i,对应的heights[i],最大的宽是多少,然后求出所有的解后,最优的便是结果。怎么求解以heights[i]为高,最大......
  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值+ 239. 滑动窗口最大值+347.前
    今天接着补上周末的栈与队列的part2,下午继续完成今天的任务。150.逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为 '+'、'-'、'*' 和 '/' 。每个......
  • 滑动窗口最大值
    滑动窗口最大值题目给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6......
  • C小题目-输入10个数,要求输出其中值最大的元素和该数是第几个数
    #include<stdio.h>intmax(intx,inty){returnx>y?x:y;};intmain(){inta[10];inti,m,n;for(i=0;i<10;i++){printf("请输入第%d个数:",i);scanf("%d",&a[i]);};for(i=0,m=a[0],n=......
  • win10安装与配置Mysql9.1时执行net start mysql显示服务名无效请输入NET HELPMSG 2185
    几年的时间mysql从5.0到9.x了,在windows系统上安装两种方式,MSI安装程序和ZIP压缩包。这里不讲安装教程,只说说安装报错的原因。最近用zip压缩包下载解压配置,下载社区版本,在官网下载对应的版本。https://downloads.mysql.com/archives/community/在前面修改my.ini文件,以及执行......
  • 53. 最大子数组和
    题目链接解题思路最大子数组问题,有两个基本的想法,以i开头的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案;以i结尾的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案。本题我们可以考虑,「以i结尾的结果是怎样的」,为啥?因为我们要求的是最大的累加和,我们求出了re......
  • LeetCode 面试题16.07[最大数值]
    题目链接LeetCode面试题16.07[最大数值]详情实例题解思路不能用ifelse就用三目表达式三目表达式:条件表达式?符合:不符合 此处条件表达式为a>b符合输出a不符合输出b即a>b?a:b代码classSolution{public:intmaximum(inta,intb){......
  • Refact.ai Match 1 (Codeforces Round 985)
    A.Set二分出最大数满足至少有\(k\)个倍数的数。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;consti32inf=INT_MAX/2;constintmo......
  • 一道题把我气笑了:) 力扣.53 最大子数组和 leetcode maximum-subarray
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续系列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • 全零子矩形计数问题
    经典问题,但是我为什么不会呢?????题意给定一张\(n\timesm\)的01矩阵,求出有多少个子矩阵使得子矩阵内没有1。\(n,m\le10^3\)分析考虑枚举每一行,计算以该行上每个点为右下角的合法子矩形个数\(\sumsum_{i,j}\),也就是说,计算左上角的个数使得左上角和该右下角形成的子矩形不......