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.

Example

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的更多相关文章

  1. array / matrix subarray/submatrix sum

    Maximal Subarray Sum : O(n) scan-and-update dynamic programming, https://en.wikipedia.org/wiki/Maxim ...

  2. [LintCode] Submatrix Sum 子矩阵之和

    Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return ...

  3. lintcode 中等题:Submatrix sum is 0 和为零的子矩阵

    和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...

  4. 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 ...

  5. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  6. [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 ...

  7. Google - Largest Sum Submatrix

    Given an NxN matrix of positive and negative integers, write code to find the submatrix with the lar ...

  8. 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 ...

  9. Max Sub-matrix

    Max Sub-matrix 教练找的题目,目前样列过了 题意:找子矩阵的最大周长 思路:先离散每列,再枚举列(n*n),在当前枚举的两列之间求每行的和(n*n*n),但是开两个数组,一个包含两列上的 ...

随机推荐

  1. PowerDesigner16工具学习笔记-建立CDM

    1.基本术语 1.1.实体和属性 实体(entity):指现实世界中客观存在,并可相互区别的事物或者事件. 属性(attribute):一组用来描述实体特征的属性. 实体集(entity set):具 ...

  2. DeepID1,DeepID2

    1.DeepID1 (Deep Learning Face Representation from Predicting 10,000 Classes) Step1:构建网络框架 DeepConvNe ...

  3. VS2013新建web项目时出错,系统找不到指定文件

    好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...

  4. 蜗牛慢慢爬 LeetCode 16. 3Sum Closest [Difficulty: Medium]

    题目 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  5. Oracle 标准版 企业版 个人版的区别 转帖

    转帖来源: https://blog.csdn.net/flg_inwind/article/details/2628133 同事方总:http://www.oracle.com/us/corpora ...

  6. 原理分析dubbo分布式应用中使用zipkin做链路追踪

    zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开 ...

  7. Spring之AOP实现原理

  8. WebSite下创建webapi

    注意这里说的是WebSite,不是Webapp 就是我们常说的新建网站,而不是新建项目 直接上代码: 1 在要在website下创建,那么应该这么干.先添加引用和global.asax 2 然后创建对 ...

  9. 【刷题】BZOJ 3512 DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅一行答案. Sample Input 100000 1000000000 Sampl ...

  10. 【刷题】LOJ 2818 「eJOI2018」循环排序

    题目描述 本题译自 eJOI2018 Problem F「Cycle Sort」 给定一个长为 \(n\) 的数列 \(\{a_i\}\) ,你可以多次进行如下操作: 选定 \(k\) 个不同的下标 ...