LeetCode 363. Max Sum of Rectangle No Larger Than K
原题链接在这里:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/
题目:
Given an m x n
matrix matrix
and an integer k
, return the max sum of a rectangle in the matrix such that its sum is no larger than k
.
It is guaranteed that there will be a rectangle with a sum no larger than k
.
Example 1:
Input: matrix = [[1,0,1],[0,-2,3]], k = 2 Output: 2 Explanation: Because the sum of the blue rectangle [[0, 1], [-2, 3]] is 2, and 2 is the max number no larger than k (k = 2).
Example 2:
Input: matrix = [[2,2,-1]], k = 3 Output: 3
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-100 <= matrix[i][j] <= 100
-105 <= k <= 105
Follow up: What if the number of rows is much larger than the number of columns?
题解:
2D Kadane's algorithm.
The outter loop should be min of (m, n).
Time Complexity: O(x^2 * y * logy). x = min(m, n). y = max(m, n).
Space: O(y).
AC Java:
1 class Solution { 2 public int maxSumSubmatrix(int[][] matrix, int k) { 3 // 2D Kadane's algorithm 4 if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ 5 return 0; 6 } 7 8 int m = matrix.length; 9 int n = matrix[0].length; 10 int res = Integer.MIN_VALUE; 11 12 // outter loop should be min(m, n). 13 for(int left = 0; left < n; left++){ 14 int [] sums = new int[m]; 15 for(int right = left; right < n; right++){ 16 // Update sums[i] as sum of row i from left to right. 17 for(int i = 0; i < m; i++){ 18 sums[i] += matrix[i][right]; 19 } 20 21 // Find no larger than k with sums. 22 // Find the max of currentSum - prevSum <= k 23 // Thus currentSum - k <= preSum, find ceiling of currentSum - k 24 TreeSet<Integer> ts = new TreeSet<>(); 25 ts.add(0); 26 int curSum = 0; 27 for(int num : sums){ 28 curSum += num; 29 Integer preSum = ts.ceiling(curSum - k); 30 if(preSum != null){ 31 res = Math.max(res, curSum - preSum); 32 } 33 34 ts.add(curSum); 35 } 36 37 } 38 } 39 40 return res; 41 } 42 }