矩形区域不超过 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,目前不会,以后再回来看;


浙公网安备 33010602011771号