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

福大大 答案2021-03-20:

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

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

package mainimport "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 子矩形
评论

©著作权归作者所有:来自51CTO博客作者福大大的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. 课程表学习代码发布
  2. Java并发编程学习笔记2
  3. 网站访问速度慢怎么办?优化这四个方面,有效解决!
  4. 300行Go代码玩转RPC
  5. Go语言核心36讲
  6. 总结了几个Java锁的面试题,看你是否能融会贯通
  7. 如何写出让大厂面试官满意的字符串复制函数(my_strcpy)?
  8. sonar+Jenkins 构建代码质量自动化分析平台
  9. 一键实现自动化部署(灰度发布)实践

随机推荐

  1. 《MyBatis从入门到精通》读书笔记
  2. JVM 面试题解答(40道全)
  3. 到底什么是脏读和幻读?为啥网上答案不一?
  4. 报表的各种坑...
  5. 常用 Git 指令整理
  6. Spring 的核心特性
  7. CCNP(ISCW)实验:用SDM配置GRE OVER IPSEC
  8. Spring-IoC
  9. 自建 GitLab,却玩到了 VMware
  10. Spring bean 依赖查找