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),但是开两个数组,一个包含两列上的 ...
随机推荐
- 基于OVS的VLAN虚拟化简易实践方案
基于OVS的VLAN虚拟化简易实践方案 前言 本实验基于ovs的vlan流表匹配,根据端口进行vlan标签插入.手工配置ovs,使其具有vlan虚拟化方案. 实验拓扑 ---- ---- | h1 | ...
- 简单封装DBUtils 和 pymysql 并实现简单的逆向工程生成class 类的py文件
这里使用的 Python 版本是:Python 3.6.0b2. 涉及的三方库:DBUtils.pymysql 1.ConfigurationParser 通过调用Python内置的 xml.dom. ...
- 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- 【BZOJ1970】[AHOI2005]矿藏编码(模拟)
[BZOJ1970][AHOI2005]矿藏编码(模拟) 题面 BZOJ 洛谷 题解 随便写个高精度模拟一下就完了. #include<iostream> #include<cstd ...
- 【bzoj4676】 两双手
http://www.lydsy.com/JudgeOnline/problem.php?id=4767 (题目链接) 题意 求在网格图上从$(0,0)$走到$(n,m)$,其中不经过一些点的路径方案 ...
- dwr框架介绍
转: [DWR框架]过时了吗? 置顶 2018年06月02日 11:59:02 许你笑颜 阅读数:4129 版权声明: https://blog.csdn.net/smileyan9/articl ...
- NO.6: 若不想编译器提供自动生成的函数,就应该明确拒绝
1.为驳回编译器自动生成函数的技能,可把这些函数的声明放入private,如果是继承类型可把base class的这些函数声明private,可在编译期间得到警告
- 基于CMS的组件复用实践
目前前端项目大多基于Vue.React.Angular等框架来实现,这一类框架都有一个明显的特点:基于模块化以及组件化思维.所以,开发者在使用上述框架时,实际上是在写一个一个的组件,并且组件与组件之间 ...
- UDP ------ UDP 和 TCP 的对比
UDP是无连接协议,客户端和服务器通信之前不需要建立握手连接: UDP没有应答机制,所以也没有重发机制,很大的可能会造成丢包.收到重复包.乱序的情况: UDP可以实现局域网广播功能,即某个主机可以向所 ...
- python oracle使用心得
Oracel安装(windows 64位) 1. 首先确定版本. 2. 下载instantclient,下载地址:http://www.oracle.com/technetwork/database/ ...