Submatrix Sum
Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return the coordinate of the left-up and right-down number.
Given matrix
[
[1 ,5 ,7],
[3 ,7 ,-8],
[4 ,-8 ,9],
]
return [(1,1), (2,2)]
分析:
本质上还是subarray sum. 因为对于要找的那个submatrix, 一定在0 和 matrix.length 之间。假设那个submatrix的上下row分别为i 和 j,那么我们可以把从i到j的那部分矩阵从上到下加起来,这样组成了一个一维数组,然后用Subarray Sum的方法解就可以了。
public class Solution {
/**
* @param matrix an integer matrix
* @return the coordinate of the left-up and right-down number
*/
public int[][] submatrixSum(int[][] matrix) {
int[][] res = new int[][];
if (matrix == null || matrix.length == || matrix[].length == ) return res; int m = matrix.length;
int n = matrix[].length;
// sum from 0,0 to i, j
int[][] sum = new int[m + ][n + ]; for (int i = ; i < sum.length; i++) {
for (int j = ; j < sum[].length; j++) {
sum[i][j] = matrix[i - ][j - ] + sum[i - ][j] + sum[i][j - ] - sum[i - ][j - ];
}
}
//如果那个为0的矩阵在row i 和 j,那么我们可以把从i到j的那部分矩阵从上到下加起来,这样组成了一个一维数组,然后用Subarray Sum的方法解就可以了 for (int r1 = ; r1 < m; r1++) {
for (int r2 = r1 + ; r2 <= m; r2++) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int j = ; j <= n; j++) {
int zeroToJSum = sum[r2][j] - sum[r1][j];
if (map.containsKey(zeroToJSum)) {
res[][] = r1;
res[][] = map.get(zeroToJSum);
res[][] = r2 - ;
res[][] = j - ;
return res;
} else {
map.put(zeroToJSum, j);
}
}
}
}
return res;
}
}
下面的代码思路和上面一样,只是实现不一样。
public class Solution {
/**
* @param matrix an integer matrix
* @return the coordinate of the left-up and right-down number
*/
public int[][] submatrixSum(int[][] matrix) {
int[][] res = new int[][];
if (matrix == null || matrix.length == || matrix[].length == ) return res; int m = matrix.length;
int n = matrix[].length;
int[][] sum = new int[m][n]; for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
if (i == ) {
sum[i][j] = matrix[i][j];
} else {
sum[i][j] = matrix[i][j] + sum[i - ][j];
}
}
} for (int r1 = ; r1 < m; r1++) {
for (int r2 = r1; r2 < m; r2++) {
res = check(sum, r1, r2);
if (res != null) return res;
}
}
return res;
} private int[][] check(int[][] sum, int r1, int r2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put(, -);
int zeroToJSum = ;
for (int j = ; j < sum[].length; j++) {
if (r1 == ) {
zeroToJSum = sum[r2][j] + zeroToJSum;
} else {
zeroToJSum = sum[r2][j] - sum[r1 - ][j] + zeroToJSum;
} if (map.containsKey(zeroToJSum)) {
int[][] res = new int[][];
res[][] = r1;
res[][] = map.get(zeroToJSum) + ;
res[][] = r2;
res[][] = j;
return res;
} else {
map.put(zeroToJSum, j);
}
}
return null;
}
}
Reference:
https://segmentfault.com/a/1190000004878083
Submatrix Sum的更多相关文章
- array / matrix subarray/submatrix sum
Maximal Subarray Sum : O(n) scan-and-update dynamic programming, https://en.wikipedia.org/wiki/Maxim ...
- [LintCode] Submatrix Sum 子矩阵之和
Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return ...
- lintcode 中等题:Submatrix sum is 0 和为零的子矩阵
和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...
- LintCode "Submatrix Sum"
Naive solution is O(n^4). But on 1 certain dimension, naive O(n^2) can be O(n) by this well-known eq ...
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- [CareerCup] 18.12 Largest Sum Submatrix 和最大的子矩阵
18.12 Given an NxN matrix of positive and negative integers, write code to find the submatrix with t ...
- Google - Largest Sum Submatrix
Given an NxN matrix of positive and negative integers, write code to find the submatrix with the lar ...
- Leetcode: Max Sum of Rectangle No Larger Than K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- Max Sub-matrix
Max Sub-matrix 教练找的题目,目前样列过了 题意:找子矩阵的最大周长 思路:先离散每列,再枚举列(n*n),在当前枚举的两列之间求每行的和(n*n*n),但是开两个数组,一个包含两列上的 ...
随机推荐
- c# 导出数据到excel
直接上代码: private void button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButton ...
- 对《OA云》作品的分析
对<OA云>作品的分析 软件描述:<OA云>是一款基于移动端的企业日常事物办公软件,企业人员进入该产品后可以对当天的出勤情况进行签到,系统会自动的识别以及记录下员工的实时签到信 ...
- 关于使用实验室服务器的GPU以及跑上TensorFlow代码
连接服务器 Windows - XShell XFtp SSH 通过SSH来连接实验室的服务器 使用SSH连接已经不陌生了 github和OS课设都经常使用 目前使用 192.168.7.169 使用 ...
- 累计进度条 PSP
每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 11月16日 代码 参与团队项目 10:05 12:12 15 112min 写博客 进度统计 21:52 2 ...
- PerfMon Metrics Collector插件的Disks I/O使用总结
做Jmeter测试的时候如果想要统计磁盘的IO读写速度,那么很容易想到用PerfMon Metrics Collector这个插件,但是具体使用过程中还有以下需要注意的. 1.如下图首先,需要选择监控 ...
- OneZero第四周第一次站立会议(2016.4.11)
1. 时间: 15:10--15:25 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- Delphi实现DBGrid全选和反选功能
Delphi实现Dbgrid全选和反选.清除全选的功能,不管是在Delphi下,还是在WEB开发中,这种功能都是很实用的,是进行数据批量操作的基础.本模块就是实现了为Delphi的DBGrid数据列表 ...
- maven项目编译运行时提示jdk版本过低问题解决方法
明明使用的是1.8jdk,但是运行项目时提示使用的是java版本是1.5,版本过低. 修改pom.xml,添加如下: <build> <plugins> <plugin& ...
- 深入理解ajax系列第六篇——头部信息
前面的话 每个HTTP请求和响应都会带有相应的头部信息,其中有的对开发人员有用.XHR对象提供了操作头部信息的方法.本文将详细介绍HTTP的头部信息 默认信息 默认情况下,在发送XHR请求的同时,还会 ...
- codeforces4A
Watermelon CodeForces - 4A Qingyu有一个简单的问题想让你解决. 输入一个数,如果它是2,或者它是奇数,输出NO,否则输出YES. 很简单吧,因此你应该很快解决. 输入 ...