题目

https://leetcode.com/problems/count-submatrices-with-all-ones/

题解

本题与 leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈) 思路相似,借鉴了原来的代码。

以及类似问题:leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

class Solution {public int numSubmat(int[][] mat) {if (mat.length == 0) return 0;int M = mat.length;int N = mat[0].length;int[][] heights = new int[M][N]; // 上方有多少个连续的1for (int i = 0; i < N; i++) {heights[0][i] = mat[0][i] - 0;for (int j = 1; j < M; j++) {if (mat[j][i] == 1) heights[j][i] = heights[j - 1][i] + 1;else heights[j][i] = 0;}}int result = 0;for (int i = 0; i < M; i++) {result += countRectangle(heights[i]);}return result;}// Reference:// leetcode 84. Largest Rectangle in Histogram// leetcode 85. Maximal Rectanglepublic int countRectangle(int[] heights) {int L = heights.length;// 找左边第一个小于h[i]的数// 从右向左遍历,维护单调不减栈,小数h[i]不断将大数h[j]弹出,则h[i]左边第一个小于h[i]的数为h[j]Stack<Integer> valueStack = new Stack<>();Stack<Integer> indexStack = new Stack<>();int[] leftIndex = new int[L]; // i左边第一个小于i的数的下标Arrays.fill(leftIndex, -1);for (int i = L - 1; i >= 0; i--) {while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {leftIndex[indexStack.pop()] = i;valueStack.pop();}valueStack.push(heights[i]);indexStack.push(i);}// 找右边第一个小于h[i]的数// 从左向右遍历,维护单调不减栈valueStack = new Stack<>();indexStack = new Stack<>();int[] rightIndex = new int[L]; // i右边第一个小于i的数的下标Arrays.fill(rightIndex, L);for (int i = 0; i < L; i++) {while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {rightIndex[indexStack.pop()] = i;valueStack.pop();}valueStack.push(heights[i]);indexStack.push(i);}// 对于每个h[i],以当前高度分别向左右扩张,计算整个大区域的长方形个数int totalRectangle = 0;boolean[][] seen = new boolean[L + 2][L + 2]; // from,tofor (int i = 0; i < L; i++) {if (seen[leftIndex[i] + 1][rightIndex[i] + 1]) continue; // 相同高度只需计算一次else seen[leftIndex[i] + 1][rightIndex[i] + 1] = true;int leftHeight = leftIndex[i] >= 0 ? heights[leftIndex[i]] : 0; // 左边第一个小于h[i]的高度int rightHeight = rightIndex[i] < L ? heights[rightIndex[i]] : 0; // 右边第一个小于h[i]的高度int validHeight = heights[i] - Math.max(leftHeight, rightHeight); // 自由的高度int validWidth = rightIndex[i] - leftIndex[i] - 1; // 自由的宽度if (heights[i] > 0) totalRectangle += (validWidth * (validWidth + 1) / 2) * validHeight;}return totalRectangle;}
}

leetcode 1504. Count Submatrices With All Ones | 1504. 统计全 1 子矩形(单调栈)相关推荐

  1. LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat , 请你返回有多少个 子矩形 的元素全部都是 1 . 示例 1: 输入:mat ...

  2. 【LeetCode】5454. 统计全 1 子矩形

    给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 . 示例 1: 输入:mat = [[1,0,1], [1,1,0], [1 ...

  3. 5454. 统计全 1 子矩形(Leetcode 196周赛)

    5454. 统计全 1 子矩形 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 . 示例 1: 输入:mat = [[1,0 ...

  4. leetcode 907. Sum of Subarray Minimums | 907. 子数组的最小值之和(单调栈)

    题目 https://leetcode.com/problems/sum-of-subarray-minimums/ 题解 单调栈问题.参考左神算法课:https://ke.qq.com/webcou ...

  5. leetcode 581. Shortest Unsorted Continuous Subarray | 581. 最短无序连续子数组(单调栈)

    题目 https://leetcode.com/problems/shortest-unsorted-continuous-subarray/ 题解 乍一看,没思路,直奔 Related Topics ...

  6. LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)

    1. 题目 给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1, ...

  7. LeetCode 38. Count and Say

    问题链接 LeetCode 38. Count and Say 题目解析 找规律,每一个数字串是上一个数字串的"读法".比如:n=1时为"1",读作" ...

  8. 【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences

    LeetCode 730. Count Different Palindromic Subsequences 博客转载自:http://zxi.mytechroad.com/blog/dynamic- ...

  9. [勇者闯LeetCode] 38. Count and Say

    [勇者闯LeetCode] 38. Count and Say Description The count-and-say sequence is the sequence of integers b ...

最新文章

  1. python英文语义角色标注_【顶会100秒】基于相似词计算的旅游词汇语义分析
  2. 如何在 ASP.NET Core 中发送邮件
  3. 集成学习的前世今生(一)
  4. 创建Maven web工程不能解析EL表达式的解决办法
  5. UE5全局光照系统Lumen解析与优化
  6. Android轮播图代码
  7. l7sa008b故障代码_Robertshaw 365-A8振动开关故障探测器
  8. 人脸识别活体检测技术
  9. CSP内容安全策略基础版
  10. IGRP/EIGRP 内部网管路由选择协议
  11. 三分频电路Verilog设计
  12. 华为服务器显示红色的心跳,服务器的心跳线
  13. 养生之道---六字气决
  14. 嵌入式系统硬件处理器架构的发展趋势及比较分析
  15. grep命令 linux
  16. 安装mysql的初始密码在哪里
  17. 小程序-同步微信运动的步数
  18. Win11怎么连接上校园网?
  19. FreeRTOS(一):裸机系统与多任务系统
  20. [Python] zip()函数

热门文章

  1. 牛客 - Prize(bitset优化暴力)
  2. CodeForces - 553C Love Triangles(二分图)
  3. HDU- 2973 YAPTCHA(威尔逊定理)
  4. 卷积神经网络精确率不增反降_深度学习 第四门课:卷积神经网络(Convolutional Neural Networks)...
  5. Docker教程-仓库管理
  6. android判断参数非空,Android Studio注释模板Live Templates参数获取不到为null的一些
  7. Spring在web中的使用
  8. 汇编指令prefix rep:
  9. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇
  10. 云计算学习路线和经典资料推荐