[LintCode]Submatrix Sum

本文介绍了一种求解二维矩阵中子矩阵和为0的算法,采用O(n^3)的时间复杂度。通过计算累积和并使用哈希表记录不同子矩阵的累积和差值,快速定位目标子矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.lintcode.com/en/problem/submatrix-sum/#

求子矩阵,和为0,要求时间复杂度O(n3)





这道题和求数组中哪些元素和为0的解决方法一样,只是数组中求的是前i个元素和前j个元素和相等,则i-j元素和为0,而这里只是变成2维的而已。
sum[i][j]表示matrix[0][0]到matrix[i-1][j-1]所有元素的和。
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + matrix[i][j] - sum[i - 1][j - 1]

然后用一条竖线k扫描,diff表示0 ~ k && i ~ j的子矩阵的和,如果与前序某个子矩阵的和相等,则找到对应和为零的子矩阵

注意map初始化的位置

public class Solution {
    public int[][] submatrixSum(int[][] matrix) {
        // Write your code here
        int[][] res = new int[2][2];
        if (matrix == null || matrix.length == 0) {
            return res;
        }
        int row = matrix.length;
        int col = matrix[0].length;
        int[][] sum = new int[row + 1][col + 1];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                sum[i + 1][j + 1] = sum[i][j + 1] + sum[i + 1][j] + matrix[i][j] - sum[i][j];
            }
        }
        for (int i = 0; i < row; i++) {
            for (int j = i + 1; j <= row; j++) {
                HashMap<Integer, Integer> map = new HashMap();
                for (int k = 0; k <= col; k++) {
                    int diff = sum[j][k] - sum[i][k];
                    if (map.containsKey(diff)) {
                        res[0][0] = i;
                        res[0][1] = map.get(diff);
                        res[1][0] = j - 1;
                        res[1][1] = k - 1;
                        return res;
                    } else {
                        map.put(diff, k);
                    }
                }
            }
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值