矩形区域不超过 K 的最大数值和--LeetCode--4.22

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

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

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

 

示例 1:

输入: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

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-100 <= matrix[i][j] <= 100
-105 <= k <= 105

同样的问题见好几次了,数据很弱,m, n的最大值只有100,二维差分数组可解

int maxSumSubmatrix(int** matrix, int matrixSize, int* matrixColSize, int k){
    int i, j, x, y;
    int sum[105][105];
    int ans, max = -999999;
    sum[1][1] = matrix[0][0];
    for(i = 0; i < matrixSize; i++){
        for(j = 0; j < matrixColSize[0]; j++){
            sum[i + 1][j + 1] = matrix[i][j] + sum[i][j + 1] + sum[i + 1][j] - sum[i][j];
        }
    }
    /*
    for(i = 0; i < matrixSize; i++){
        for(j = 0; j < matrixColSize[0]; j++){
            printf("%d\t",sum[i + 1][j + 1]);
        }
        printf("\n");
    }
    */
    for(i = 0; i < matrixSize; i++){
        for(j = 0; j < matrixColSize[0]; j++){
            for(x = i; x < matrixSize; x++){
                 for(y = j; y < matrixColSize[0]; y++){
                      ans = sum[x + 1][y + 1] - sum[i][y + 1] - sum[x + 1][j] + sum[i][j];
                      if(ans <= k){
                          if(max < ans){
                              max = ans;
                          }
                      }
                }
            }
        }
    }
    return max;
}

 这道题最好的解法应该是DP,目前不会,以后再回来看;

 

 

posted @ 2021-04-22 18:31  荣荣荣荣荣荣  阅读(127)  评论(0)    收藏  举报