力扣:525.连续数组和1314.矩阵区域和(二维前缀和)

相关文章:C++算法:前缀和与哈希表实战

C++算法:一维/二维前缀和算法模板题

目录

1.连续数组

理解题意

算法原理

2.矩阵区域和

理解题意

算法原理


1.连续数组

https://leetcode.cn/problems/contiguous-array/

理解题意

在二进制数组中找相同数量的0和1的最长子数组,返回其长度

算法原理

本题如果是按照题目要求,依次找到数量相同且连续的0和1,那么是相对较难的,而我们可以转化题目要求:将0转化为-1,由于1不变,所以当连续数组和为0时,就证明这一段的子数组满足题目要求。

与上一篇文章中:和为k的子数组,题目相似。不同点在于本题是在找长度,使用unordered_map<int, int> hash;时,需要存储的是前缀和与下标。并且,需要先定义hash0 = -1;同样模拟实现前缀和。

细节:

1.存入哈希表的时机:使用完之后,丢进哈希表

2.有重复的<sum, i> ,保留前一对<sum, i>

3.长度:因为是求下标,所以为i- j:

复制代码
class Solution 
{
public:
    int findMaxLength(vector<int>& nums) 
    {
        unordered_map<int, int> hash;
        hash[0] = -1;
        int sum = 0, ret = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            sum += nums[i] == 0 ? -1 : 1;
            if(hash.count(sum)) ret = max(ret, i - hash[sum]);
            else hash[sum] = i;
        }
        return ret;
    }
};

2.矩阵区域和

https://leetcode.cn/problems/matrix-block-sum/description/

理解题意

以示例一为例:

k=1,表示在指定区域周围多拓展1格,返回值是将其中的数字依次相加求和。

原矩阵为mat,返回矩阵为answer

算法原理

本题是一道二维前缀和题目,我们先自行推导公式:

确定代码条件:

考虑下标映射关系,对mat而言,起始下标为(0,0),对dp和ans而言,起始下标为(1,1):

复制代码
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] - dp[i - 1][j - 1] + mat[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;
                int y1 = max(0, j - k) + 1;
                int x2 = min(m - 1, i + k) + 1;
                int 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;
    }
};

本章完。

相关推荐
江畔柳前堤1 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore2 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考4 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX4 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面5 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号5 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽5 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI5 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者7 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者7 小时前
【征程6】校准量化中HistogramObserver解析
算法