每日一题2

用C++代码实现以下功能:

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。


答案:

答案一

class NumMatrix {
private:
    vector<vector<int>> dp;
    int rows = 0;
    int cols = 0;
public:
    NumMatrix(vector<vector<int>>& matrix) {
        dp = std::move(matrix);
        rows = dp.size();
        if (rows)
            cols = dp[0].size();
        else
            return;
        for (int i = 1; i < rows; i++)
            dp[i][0] += dp[i - 1][0];
        for (int j = 1; j < cols; j++)
            dp[0][j] += dp[0][j - 1];
        for (int i = 1; i < rows; i++)
            for (int j = 1; j < cols;j ++) {
                dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
            }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        auto ret = dp[row2][col2];
        row1--;
        col1--;
        if (row1 >= 0)
            ret -= dp[row1][col2];
        if (col1 >= 0)
            ret -= dp[row2][col1];
        if (row1 >= 0 && col1 >= 0)
            ret += dp[row1][col1];
        return ret;
    }
};

答案二

class NumMatrix {
private:
    vector<vector<int>> sum;
public:
    NumMatrix(vector<vector<int>>& matrix) {
        if (matrix.empty())
            return;
        
        int m = matrix.size();
        int n = matrix[0].size();
        for (int i = 0; i < m; i++) {
            sum.emplace_back(n, 0);
            for (int j = 0; j < n; j++) {
                if (i)
                    sum[i][j] += sum[i - 1][j];
                if (j)
                    sum[i][j] += sum[i][j - 1];
                if (i && j)
                    sum[i][j] -= sum[i - 1][j - 1];
                sum[i][j] += matrix[i][j];
            }
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        int res = sum[row2][col2];
        if (row1)
            res -= sum[row1 - 1][col2];
        if (col1)
            res -= sum[row2][col1 - 1];
        if (row1 && col1)
            res += sum[row1 - 1][col1 - 1];
        return res;
    }
};

个人感觉这种题目没必要硬往面向对象来靠,还非得使用迭代器(可能是我用不习惯),自我感叹一句我好菜

原文地址:https://www.cnblogs.com/Weber-security/p/12709349.html