zoukankan      html  css  js  c++  java
  • 每日一题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;
        }
    };
    

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

  • 相关阅读:
    POJ3352 Road Construction (双连通分量)
    强连通分量(模板)
    图基本概念
    Air Raid(最小路径覆盖)
    Machine Schedule(最小覆盖)
    hdoj 1564 Play a game
    nyoj 483 Nightmare【bfs+优先队列】
    hdoj 1083 Courses【匈牙利算法】
    hdoj 2036 改革春风吹满地
    nyoj 353 3D dungeon
  • 原文地址:https://www.cnblogs.com/Weber-security/p/12709349.html
Copyright © 2011-2022 走看看