• Subarray/Submatrix Target Sum


    Leetcode 560. Subarray Sum Equals K

    求一个数组中和等于k的子数组的个数

    分析:prefix sum + map,当前的prefix sum为cur,之前出现过的prefix sum存到counter中(因为存在负数,可能有多个prefix sum相等,因此counter[x]表示prefix sum == x的个数),

    则以当前点为endpoint的子数组和等于K的个数为counter[cur - k]

    time O(n) 

    space O(n)

    class Solution {
    public:
        int subarraySum(vector<int>& nums, int k) {
            int res = 0, cur = 0;
            unordered_map<int, int> counter;
            counter[0] = 1;
            for(int i = 0; i < nums.size(); ++i){
                cur += nums[i];
                res += counter[cur - k];
                counter[cur]++;
            }
            return res;
        }
    };

     Leetcode 1074. Number of Submatrices That Sum to Target

    求一个矩阵中和等于target的子矩阵的个数

    分析:矩阵每一行,计算prefix sum,然后对于任意两列,计算行的累加和,问题就转换为了Subarray Sum Equals K

    time O($n^3$)

    space O(n)

    class Solution {
    public:
        int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) {
            int m = matrix.size(), n = matrix[0].size();
            for(int i = 0; i < m; ++i){
                for(int j = 1; j < n; ++j){
                    matrix[i][j] += matrix[i][j - 1];
                }
            }
            int res = 0;
            for(int i = 0; i < n; ++i){
                for(int j = i; j < n; ++j){
                    //计算列i与列j之间且宽为j-i+1的所有和等于target的子矩阵个数
                    //等价与将问题转换为了Subarray Sum Equals K
                    unordered_map<int, int> counter;
                    counter[0] = 1;
                    int cur = 0;
                    for(int k = 0; k < m; ++k){
                        cur += matrix[k][j] - (i > 0 ? matrix[k][i - 1] : 0);
                        res += counter[cur - target];
                        counter[cur]++;
                    }
                }
            }
            return res;
        }
    };
  • 相关阅读:
    varnish4.X安装
    关于varnish缓存
    s3cmd的使用
    MarkdownPad 2
    Lua控制语句
    Lua表达式
    后端怎么防止重复提交?(常用的做法)
    Redis用setnx+expire实现分布式锁存在什么隐患,如何改进?
    推送消息为什么使用RocketMQ,而不使用Kafka?
    自定义线程池,如何最佳创建线程池
  • 原文地址:https://www.cnblogs.com/betaa/p/11642358.html
Copyright © 2020-2023  润新知