[LintCode]Submatrix Sum

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;
    }
}


發佈了363 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章