题目描述 :给你一个 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)。
思考 : DP、前缀和、状态压缩
1、朴素二维前缀和(暴力)
- 时间复杂度为:O(N4)。
- 空间复杂度:O(N2)。
代码:
class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int R = matrix.length;int C = matrix[0].length;int[][] dp = new int[R+1][C+1];int maxSum = Integer.MIN_VALUE;for(int i1 = 1; i1 <= R; i1++){for(int j1 = 1; j1<= C; j1++){for(int[] OneDimension : dp){Arrays.fill(OneDimension, 0);}dp[i1][j1] = matrix[i1-1][j1-1];for(int i2 = i1; i2 <= R; i2++){for(int j2 = j1; j2<= C; j2++){dp[i2][j2] = dp[i2][j2-1] + dp[i2-1][j2] -dp[i2-1][j2-1] + matrix[i2-1][j2-1];if(dp[i2][j2] <= k && dp[i2][j2] > maxSum){maxSum = dp[i2][j2];}}}}}return maxSum;}}
2、思想还是定边界,先定行的上下边界,把时间复杂度定在O(N2),然后再遍历左右边界,时间复杂度控制在O(M),细节待补充。
3、疑问:在加了 K 的约束后,一维上的前缀和算法不成立了,如何解决这个问题
