ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode 303. 区域和检索 - 数组不可变(中等) 304. 二维区域和检索 - 矩阵不可变(中等) 560. 和为K的子数组(中等) 前缀和数组求窗口和

2022-02-26 18:35:44  阅读:223  来源: 互联网

标签:检索 前缀 NumArray int 中等 vector 数组 presum matrix


labuladong讲解

303. 区域和检索 - 数组不可变(中等)

题目:

 

 思路:

用前缀和记录开始到当前位置的元素和,这里前缀和数组长度n+1,presum[n+1]代表0-n的元素和

 

class NumArray {
public:
    NumArray(vector<int>& nums) {
        int n=nums.size();
        presum.resize(n+1);
        for(int i=1;i<=n;++i){
            presum[i]=presum[i-1]+nums[i-1];
        }
    }
    
    int sumRange(int left, int right) {
        return presum[right+1]-presum[left];
    }
    vector<int> presum;
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

 

304. 二维区域和检索 - 矩阵不可变(中等)

题目:

 

 思路:

 

 

前缀和数组记录[0][0]->[i][j]的所有元素和。为了方便求值,在遍历时presum[i][j]=presum[i-1][j](原点到上边一点的矩形)+presum[i][j-1](原点到左边一点的矩形)-presum[i-1][j-1](原点到左上方的矩形)+matrix[i-1][j-1](加上当前点)

然后求值时presum[row2+1][col2+1](绿色)-presum[row2+1][col1](橙色)-presum[row1][col2+1](蓝色)+presum[row1][col1](粉色)

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

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix* obj = new NumMatrix(matrix);
 * int param_1 = obj->sumRegion(row1,col1,row2,col2);
 */

 

560. 和为K的子数组(中等)

题目:

 

 

思路:

用哈希表记录当前的前缀和

然后在累加前缀和时,从哈希表中查找相减等于k的值,并累加其次数

 

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> m;
        int sum=0;
        //base case,当前缀和本身==k时,会查找到0
        m[0]=1;
        int ret=0;
        for(int i=0;i<nums.size();++i){
            sum+=nums[i];
            //查找与sum相减为k的位置
            int other=sum-k;
            if(m.count(other)>0){
                ret+=m[other];
            }
            //累加前缀和为sum的次数
            m[sum]++;
        }
        return ret;
    }
};

 

标签:检索,前缀,NumArray,int,中等,vector,数组,presum,matrix
来源: https://www.cnblogs.com/zl1991/p/15940085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有