2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数
16lz
2021-03-21
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 子矩形
评论
你的鼓励让我更有动力
赞赏
0人进行了赞赏支持
更多相关文章
- 课程表学习代码发布
- Java并发编程学习笔记2
- 网站访问速度慢怎么办?优化这四个方面,有效解决!
- 300行Go代码玩转RPC
- Go语言核心36讲
- 总结了几个Java锁的面试题,看你是否能融会贯通
- 如何写出让大厂面试官满意的字符串复制函数(my_strcpy)?
- sonar+Jenkins 构建代码质量自动化分析平台
- 一键实现自动化部署(灰度发布)实践