我们先来实现一个二维数组的前缀:

int main()
{
    int n, m, q;
    cin>>n >>m >> q;
    vector<vector<int>> arr(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> arr[i][j];
        }
    }

    vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];

            int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
            while (q > 0) {
                q--;
                cin >> x1 >> y1 >> x2 >> y2;
                cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1] << endl;

            }
        }
    }
    return 0;
}

1.

class Solution {

public:

    vector<int> productExceptSelf(vector<int>& nums) {

        int n=nums.size();

        vector<int> f(n),g(n);

       

        f[0]=1;

        g[n-1]=1;

        for(int i=1;i<n;i++){

            f[i]=f[i-1]*nums[i-1];

        }

        for(int i=n-2;i>=0;i--){

            g[i]=g[i+1]*nums[i+1];

        }

        vector<int> ret(n);

        for(int i=0;i<n;i++){

            ret[i]=f[i]*g[i];

        }

        return ret;

    }

};

2.

class Solution {

public:

    int subarraySum(vector<int>& nums, int k) {

        unordered_map<int,int> hash;

        hash[0]=1;

        int sum=0,ret=0;

        for(auto e:nums){

            sum+=e;

            if(hash.count(sum-k)) ret+=hash[sum-k];

            hash[sum]++;

        }

        return ret;

    }

};

3.

class Solution {

public:

    int pivotIndex(vector<int>& nums) {

        int n=nums.size();

        vector<int> f(n),g(n);

        for(int i=1;i<n;i++){

            f[i]=f[i-1]+nums[i-1];

        }

        for(int j=n-2;j>=0;j--){

            g[j]=g[j+1]+nums[j+1];

        }

        for(int i=0;i<n;i++){

            if(f[i]==g[i]){

                return i;

            }

        }

        return -1;

    }

};

4.

class Solution {

public:

    int findMaxLength(vector<int>& nums) {

        int n=nums.size();

        unordered_map<int,int> hash;

        hash[0]=-1;

        int sum=0,ret=0;

        for(int i=0;i<n;i++){

            sum+=nums[i]==0?-1:1;

            if(hash.count(sum)) ret=max(ret,i-hash[sum]);

            else hash[sum]=i;

        }

        return ret;

    }

};

5.

class Solution {

public:

    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {

        int m=mat.size(),n=mat[0].size();

        vector<vector<int>> dp(m+1,vector<int>(n+1));

        for(int i=1;i<=m;i++){

            for(int j=1;j<=n;j++){

                dp[i][j]=dp[i-1][j]+dp[i][j-1]+mat[i-1][j-1]-dp[i-1][j-1];

            }

        }

        vector<vector<int>> ret(m,vector<int>(n));

        for(int i=0;i<m;i++){

            for(int j=0;j<n;j++){

                int x1=max(0,i-k)+1,y1=max(0,j-k)+1;

                int x2=min(m-1,i+k)+1,y2=min(n-1,j+k)+1;

                ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];

            }

        }

        return ret;

    }

};

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐