• 剑指 Offer II 040. 矩阵中最大的矩形


    题目链接

    力扣

    题目描述

    给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。

    注意:此题 matrix 输入格式为一维 01 字符串数组。

    示例 1:

    输入:matrix = ["10100","10111","11111","10010"]
    输出:6
    解释:最大矩形如上图所示。
    示例 2:

    输入:matrix = []
    输出:0
    示例 3:

    输入:matrix = ["0"]
    输出:0
    示例 4:

    输入:matrix = ["1"]
    输出:1
    示例 5:

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

    提示:

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

    解题思路

    此题可以在上一题的基础上做,把每一行单独处理,下一行的每个元素如果符合:

    1、当前元素不为0

    2、上一行对应位置元素不为0

    的情况下就可以把上一行的元素加到本行

    代码

    Python

    1. class Solution:
    2. def maximalRectangle(self, matrix: list[str]) -> int:
    3. def largestRectangleArea(heights: list[int]) -> int:
    4. stack = []
    5. stack.append(0)
    6. heights.insert(0, 0)
    7. heights.append(0)
    8. maxArea = 0
    9. for i in range(1, len(heights)):
    10. while heights[stack[-1]] > heights[i]:
    11. height = heights[stack.pop()]
    12. width = i - stack[-1] - 1
    13. maxArea = max(maxArea, height * width)
    14. stack.append(i)
    15. return maxArea
    16. if not matrix:
    17. return 0
    18. newMatrix = [[0 for _ in range(len(matrix[0]))]]
    19. for row in range(len(matrix)):
    20. rowlist = list(matrix[row])
    21. rowlist = [int(x) for x in rowlist]
    22. for i in range(len(rowlist)):
    23. if newMatrix[row][i] != 0 and rowlist[i] != 0:
    24. rowlist[i] += newMatrix[row][i]
    25. newMatrix.append(rowlist)
    26. maxArea = 0
    27. for i in range(1, len(newMatrix)):
    28. maxArea = max(maxArea, largestRectangleArea(newMatrix[i]))
    29. return maxArea

    Go

    1. type stack []int
    2. func (s *stack) push(i int) {
    3. *s = append(*s, i)
    4. }
    5. func (s *stack) pop() int {
    6. a := *s
    7. i := a[len(a)-1]
    8. *s = a[:len(a)-1]
    9. return i
    10. }
    11. func (s *stack) top() int {
    12. a := *s
    13. return a[len(a)-1]
    14. }
    15. func largestRectangleArea(heights []int) int {
    16. var stack stack
    17. addDummy := make([]int, len(heights)+2)
    18. for i := 0; i < len(heights); i++ {
    19. addDummy[i+1] = heights[i]
    20. }
    21. heights = addDummy
    22. stack.push(0)
    23. maxArea := 0
    24. for i := 1; i < len(heights); i++ {
    25. for heights[stack.top()] > heights[i] {
    26. height := heights[stack.pop()]
    27. width := i - stack.top() - 1
    28. if height*width > maxArea {
    29. maxArea = height * width
    30. }
    31. }
    32. stack.push(i)
    33. }
    34. return maxArea
    35. }
    36. func intMatrix(matrix []string) [][]int {
    37. zero := make([]int, len(matrix[0]))
    38. ans := [][]int{zero}
    39. for _, s := range matrix {
    40. tmp := []int{}
    41. for i := 0; i < len(s); i++ {
    42. tmp = append(tmp, int(s[i]-'0')) //必须减'0'因为go中都用uint8存储字符
    43. }
    44. ans = append(ans, tmp)
    45. }
    46. return ans
    47. }
    48. func maximalRectangle(matrix []string) int {
    49. if len(matrix) == 0 {
    50. return 0
    51. }
    52. intMatrix := intMatrix(matrix)
    53. for row := 1; row < len(intMatrix); row++ {
    54. for k, v := range intMatrix[row] {
    55. if intMatrix[row][k] != 0 && intMatrix[row-1][k] != 0 {
    56. intMatrix[row][k] = v + intMatrix[row-1][k]
    57. }
    58. }
    59. }
    60. maxArea := 0
    61. for i := 1; i < len(intMatrix); i++ {
    62. size := largestRectangleArea(intMatrix[i])
    63. if size > maxArea {
    64. maxArea = size
    65. }
    66. }
    67. return maxArea
    68. }
  • 相关阅读:
    MySQL数据生成工具mysql_random_data_load
    ARM Linux 设备树详细介绍(2)共二篇
    流媒体协议之RTSP详解
    Laserfiche在人工智能数据捕捉服务中嵌入手写识别功能
    MYSQL 事务、事务隔离级别和MVCC,幻读
    Mysql常用函数
    Java基于SpringBoot的车辆充电桩
    使用 nlohmann 解析 json 文件
    常用的git分支管理方法都在这了
    【Qt事件】
  • 原文地址:https://blog.csdn.net/qq_33523932/article/details/125525461