2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。

举报
福大大架构师每日一题 发表于 2021/03/20 23:09:31 2021/03/20
【摘要】 2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。福大大 答案2021-03-20:按行遍历二维数组,构造直方图。单调栈,大压小。有代码。代码用golang编写,代码如下:package mainimport "fmt"func main() { matrix := [][]int{ {1, 1, 1, 1, 1, 1...

2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。

福大大 答案2021-03-20:

按行遍历二维数组,构造直方图。
单调栈,大压小。有代码。

代码用golang编写,代码如下:

package main

import "fmt"

func main() {
    matrix := [][]int{
        {1, 1, 1, 1, 1, 1},
    }
    ret := numSubmat(matrix)
    fmt.Println(ret)
}
func numSubmat(mat [][]int) int {
    if len(mat) == 0 || len(mat[0]) == 0 {
        return 0
    }
    nums := 0
    height := make([]int, len(mat[0]))
    for i := 0; i < len(mat); i++ {
        for j := 0; j < len(mat[0]); j++ {
            if mat[i][j] == 0 {
                height[j] = 0
            } else {
                height[j]++
            }
        }
        nums += countFromBottom(height)
    }
    return nums

}

func countFromBottom(height []int) int {
    if len(height) == 0 {
        return 0
    }
    nums := 0
    stack := make([]int, len(height))
    si := -1
    for i := 0; i < len(height); i++ {
        for si != -1 && height[stack[si]] >= height[i] {
            cur := stack[si]
            si--
            if height[cur] > height[i] {
                left := -1
                if si != -1 {
                    left = stack[si]
                }
                n := i - left - 1
                heightleft := 0
                if left != -1 {
                    heightleft = height[left]
                }
                down := getMax(heightleft, height[i])
                nums += (height[cur] - down) * num(n)
            }

        }
        si++
        stack[si] = i
    }
    for si != -1 {
        cur := stack[si]
        si--
        left := -1
        if si != -1 {
            left = stack[si]
        }
        n := len(height) - left - 1
        down := 0
        if left != -1 {
            down = height[left]
        }
        nums += (height[cur] - down) * num(n)
    }
    return nums
}

func num(n int) int {
    return (n * (1 + n)) >> 1
}
func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

执行结果如下:
在这里插入图片描述


左神java代码
力扣1504. 统计全 1 子矩形
评论

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。