public static ArrayList<Submatrix> findLargestSubmatrix3(int[][] matrix) {
        if (matrix == null) return null;
        int maxSum = Integer.MIN_VALUE;
        ArrayList<Submatrix> result = new ArrayList<Submatrix>();
        for (int x1 = 0; x1 < matrix.length; ++x1) {
            int[] subArray = new int[matrix[0].length];
            for (int x2 = x1; x2 < matrix.length; ++x2) {
                for (int y = 0; y < matrix[0].length; ++y) {
                    subArray[y] += matrix[x2][y];
                }
                int[] res = findLargestSubarray(subArray);
                int y1 = res[0], y2 = res[1], sum = res[2];
                Submatrix submatrix = new Submatrix(x1, y1, x2, y2, sum);
                if (sum > maxSum) {
                    maxSum = sum;
                    result.clear();
                    result.add(submatrix);
                } else if (sum == maxSum) {
                    result.add(submatrix);
                }
            }
        }
        return result;
    }