给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。


    题目数据保证总会存在一个数值和不超过 k 的矩形区域。

    示例 1:
    image.png

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


    示例 2:

    输入:matrix = [[2,2,-1]], k = 3 输出:3

    1.暴力法:

    1. public static int maxSumSubmatrix(int[][] matrix, int k) {
    2. if(matrix.length == 0 || matrix[0].length == 0) {
    3. return 0;
    4. }
    5. int rows = matrix.length;//获取数组的长度
    6. int cols = matrix[0].length;//获取数组的列数
    7. int[] rowSum = new int[rows];//把每一行看成一个值
    8. TreeSet<Integer> set = new TreeSet<>();
    9. int num = Integer.MIN_VALUE;//与Math.abs(Integer.MIN_VALUE)同,绝对值
    10. int colSum;//每列的和
    11. for(int s = 0; s < cols; s++) {//开始列
    12. Arrays.fill(rowSum, 0);//填充数组
    13. for(int e = s; e < cols; e++) {//结束列
    14. set.clear();//清除元素
    15. set.add(0);
    16. colSum = 0;
    17. for(int i = 0; i < rows; i++) {
    18. rowSum[i] += matrix[i][e];//数组行的和
    19. colSum += rowSum[i];//数组列的和
    20. Integer temp = set.ceiling(colSum - k);//返回最大值
    21. if(temp != null) {
    22. num = Math.max(num, colSum - temp);//比较大小
    23. }
    24. set.add(colSum);
    25. }
    26. }
    27. }
    28. System.out.println(num);
    29. return num;
    30. }
    31. public static void main(String [] args) {
    32. int [][] m= new int[][]{{1,0,1},{0,-2,3}};
    33. int k =2;
    34. maxSumSubmatrix(m,k);
    35. }

    image.png