面试题 17.24. 最大子矩阵
给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
注意:本题相对书上原题稍作改动
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-submatrix-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
private int[] getMaxRegionSum(int[] arr) {
if (arr == null || arr.length == 0) {
return new int[]{0, -1, -1};
}
int sum = 0;
int left = 0, right = 0;
int ans = arr[0];
int ansLeft = 0, ansRight = 0;
for (int i = 0; i < arr.length; ++i) {
if (sum <= 0) {
sum = arr[i];
left = right = i;
} else {
sum += arr[i];
right = i;
}
if (ans < sum) {
ans = sum;
ansLeft = left;
ansRight = right;
}
}
return new int[]{ans, ansLeft, ansRight};
}
public int[] getMaxMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int[] ans = new int[4];
int max = Integer.MIN_VALUE;
for (int i = 0; i < matrix.length; ++i) {
int[] sum = new int[matrix[0].length];
for (int j = i; j < matrix.length; ++j) {
for (int k = 0; k < matrix[0].length; ++k) {
sum[k] = sum[k] + matrix[j][k];
}
int[] maxRegionSum = getMaxRegionSum(sum);
if (maxRegionSum[0] > max) {
max = maxRegionSum[0];
ans[0] = i;
ans[1] = maxRegionSum[1];
ans[2] = j;
ans[3] = maxRegionSum[2];
}
}
}
return ans;
}
}
心之所向,素履以往 生如逆旅,一苇以航
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】