题目:
给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。
请你返回元素总和小于或等于阈值的正方形区域的最大边长;如果没有这样的正方形区域,则返回 0 。
算法:
方法一:前缀和。
简单的前缀和题目,计算length,细心一点
func maxSideLength(mat [][]int, threshold int) int {
m, n := len(mat), len(mat[0])
prefixSum := make([][]int, m + 1)
for i := range prefixSum {
prefixSum[i] = make([]int, n + 1)
}
for i := range mat {
for j := range mat[i] {
prefixSum[i + 1][j + 1] = prefixSum[i + 1][j] + prefixSum[i][j + 1] - prefixSum[i][j] + mat[i][j]
}
}
for length := min(m, n); length > 0; length -- {
for i := m; i > 0 && i - length >= 0 ; i -- {
for j := n; j > 0 && j - length >= 0; j -- {
// if i - length < 0 || j - length < 0 {
// continue
// }
sum := prefixSum[i][j] - prefixSum[i - length ][j] - prefixSum[i][j - length ] + prefixSum[i - length ][j - length]
if sum <= threshold {
return length
}
}
}
}
return 0
}
func min (a, b int) int {
if a < b {
return a
}
return b
}