Переполнение кучи в коде 1314

#matrix #prefix-sum

#матрица #префикс-сумма

Вопрос:

Вопрос: https://leetcode.com/problems/matrix-block-sum /

Я пытаюсь решить эту проблему, используя 2D-префикс sum, где sum[i][j] это сумма всех элементов с левой стороны, включая элемент и его строку и столбец.

Код :

 class Solution {
public:
    int n, m;
    int getSum(int i, int j, vector<vector<int>>amp; sum) {
        if(i<0 || j<0) return 0;
        if (i >= n) i = m - 1;
        if (j >= n) j = m - 1;
        return sum[i][j];
    }
    
    vector<vector<int>> matrixBlockSum(vector<vector<int>>amp; mat, int k) {
        n = mat.size();
        m = mat[0].size();
        vector<vector<int>> sum(n, vector<int>(m, 0)), res(n, vector<int>(m, 0));
        for(int i=0; i<n; i  ) {
            for(int j=0; j<m; j  ) {
                sum[i][j] = mat[i][j]   getSum(i-1, j, sum)   getSum(i, j-1, sum) - getSum(i-1, j-1, sum);
            }
        }
        for(int i=0; i<n; i  ) {
            for(int j=0; j<m; j  ) {
                res[i][j] = getSum(i k, j k, sum) - getSum(i-k-1, j k, sum) - getSum(i k, j-k-1, sum)   getSum(i-k-1, j-k-1, sum);
            }
        }
        return res;
    }
};
  

Ответ №1:

  • Ошибка, вероятно, будет в последнем цикле среди этих индексов.
                 res[i][j] = getSum(i k, j k, sum) - getSum(i-k-1, j k, sum) - getSum(i k, j-k-1, sum)   getSum(i-k-1, j-k-1, sum);
  
  • Вот тот же метод с разными именами переменных, будет проходить:
 // The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>

static const struct Solution {
        static const std::vector<std::vector<int>> matrixBlockSum(
                    const std::vector<std::vector<int>>amp; mat,
                    const int K
        ) {
            const std::size_t row_len = std::size(mat);
            const std::size_t col_len = row_len ? std::size(mat[0]) : 0;

            std::vector<std::vector<int>> sums(row_len, std::vector<int>(col_len, 0));

            for (std::size_t row = 0; row < row_len;   row) {
                for (std::size_t col = 0; col < col_len;   col) {
                    sums[row][col] = mat[row][col]  
                                     getPrefixSum(row - 1, col, sums)  
                                     getPrefixSum(row, col - 1, sums) -
                                     getPrefixSum(row - 1, col - 1, sums);
                }
            }

            std::vector<std::vector<int>> res(row_len, std::vector<int>(col_len, 0));

            for (std::size_t row = 0; row < row_len;   row) {
                for (std::size_t col = 0; col < col_len;   col) {
                    res[row][col] = getPrefixSum(row   K, col   K, sums) -
                                    getPrefixSum(row   K, col - K - 1, sums) -
                                    getPrefixSum(row - K - 1, col   K, sums)  
                                    getPrefixSum(row - K - 1, col - K - 1, sums);
                }
            }

            return res;
        }

    private:

        static const int getPrefixSum(
            int row,
            int col,
            const std::vector<std::vector<int>>amp; sums
        ) {
            if (row < 0 || col < 0) {
                return 0;
            }

            if (row >= std::size(sums)) {
                row = std::size(sums) - 1;
            }

            if (col >= std::size(sums[0])) {
                col = std::size(sums[0]) - 1;
            }

            return sums[row][col];
        }
};
  

Комментарии:

1. Спасибо. Но я не могу понять, что не так в моем коде по сравнению с вашим.