1292. 元素和小于等于阈值的正方形的最大边长

79 阅读1分钟

题目:
给你一个大小为 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
}