力扣: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;
    }
};

本章完。

相关推荐
ZhengEnCi13 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David14 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi14 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_61814 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang14 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_9707038316 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021416 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi17 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang17 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!18 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法