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

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

示例:

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

说明:

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

Reviewer:

我又读错了题...我求成了最大面积...

心累...

强调一下这个findmax方法,很精妙~


Code:

class Solution {
        public int maxSumSubmatrix(final int[][] matrix, int k) {
            if (matrix.length == 0) return 0;
            int row = matrix.length, col = matrix[0].length, max = Integer.MIN_VALUE;
            for (int i = 0; i < col; i++) {
                int[] sum = new int[row];
                for (int j = i; j < col; j++) {
                    for (int m = 0; m < row; m++) {
                        sum[m] += matrix[m][j];
                    }
                    max = Math.max(max, findMax(sum, k));
                }
            }
            return max;
        }

        private static int findMax(int[] sum, int k) {
            int cum = 0, max = Integer.MIN_VALUE;
            TreeSet<Integer> set = new TreeSet<>();
            set.add(0);
            for (int i = 0; i < sum.length; i++) {
                cum += sum[i];
                Integer gap = set.ceiling(cum - k);
                if (gap != null) max = Math.max(max, cum - gap);
                set.add(cum);
            }
            return max;
        }
}

猜你喜欢

转载自blog.csdn.net/start_lie/article/details/88899385