Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和

363. 矩形区域不超过 K 的最大数值和

给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。

示例:

输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
说明:

矩阵内的矩形区域面积必须大于 0。
如果行数远大于列数,你将如何解答呢?

class Solution {

 
public static int maxSumSubmatrix(int[][] matrix, int k) {
    int m = matrix.length;
    int n = matrix[0].length;
    int[][] sums = new int[m][n];

    /**
     * 按照列来求和
     */
    for(int col = 0 ; col < n; col ++){
        for(int row = 0 ; row < m ; row ++){
            if(row == 0)
                sums[row][col] = matrix[row][col];
            else
                sums[row][col] = sums[row - 1][col] + matrix[row][col];
        }
    }

    /**
     * col1为矩阵起始列,col2为矩阵结尾列
     */
    int result = Integer.MIN_VALUE ;
     for(int col1 = 0 ; col1 < n ; col1 ++){
        for(int col2 = col1; col2 < n ; col2++){
            /**
             * set中都是存放的是startCol和endCol相同的矩阵的和
             */
            TreeSet<Integer> set = new TreeSet<>();
            set.add(0);
            for(int row = 0 ; row < m ; row++){
                int sum = 0;  //子矩阵的和
                for(int i = col1; i <= col2 ; i ++){
                    sum += sums[row][i];
                }

                //求出set中大于等于(sum - k)最小值
                if(set.ceiling(sum - k) != null){
                    int max = sum - set.ceiling(sum - k);
                    result = result > max ? result : max;
                }
                set.add(sum);
            }
        }
    }
    return result;
}
}
发布了1477 篇原创文章 · 获赞 1万+ · 访问量 182万+

猜你喜欢

转载自blog.csdn.net/a1439775520/article/details/104774338