跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

前缀和算法实战:连续数组与矩阵区域和解析

综述由AI生成针对连续数组与矩阵区域和问题,核心在于前缀和技巧的运用。将 0 视为 -1 可将连续数组问题转化为寻找和为零的最长子区间,配合哈希表记录索引可高效求解。矩阵区域和则依赖二维前缀和预处理,通过坐标映射公式快速计算任意子矩阵和,需注意边界条件的 min/max 处理。代码示例展示了具体实现细节,有助于理解算法优化思路。

moshang发布于 2026/3/30更新于 2026/6/819 浏览
前缀和算法实战:连续数组与矩阵区域和解析

在这里插入图片描述

前言

聚焦算法题实战,系统讲解核心板块。优选算法部分剖析动态规划、二分法等高效策略,学会寻找'最优解'。递归与回溯掌握问题分解与状态回退,攻克组合排列难题。贪心算法理解从局部到全局的思路,解决区间调度等问题。内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

31. 连续数组

题目链接:

525. 连续数组 - 力扣(LeetCode)

题目描述:

在这里插入图片描述

题目示例:

在这里插入图片描述

解法(前缀和 + 哈希表)

算法思路

稍微转换一下题目,就会变成我们熟悉的题型。

本题让我们找出一段连续的区间,其中 0 和 1 出现的次数相同。如果将 0 记为 -1,1 记为 1,问题就变成了找出一段区间,这段区间的和等于 0。

找到在 [0, i-1] 区间内,第一次出现 sum[i] 的位置即可。

于是,就和之前做过的那个和为 k 的子数组的题思路类似了。

在这里插入图片描述

设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。 想知道最大的【以 i 结尾的和为 0 的子数组】,就要找到从左往右第一个 x1 使得 [x1, i] 区间内所有元素的和为 0。那么 [0, x1-1] 区间内的和是不是就是 sum[i] 了。于是问题就变成:

我们还是不用真的初始化一个前缀和数组,因为我们只关心 i 位置之前,第一个前缀和等于 sum[i] 的位置,因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边记录第一次出现该前缀和的位置。

C++ 算法代码

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        unordered_map<int, int> hash;
        hash[0] = -1; // 默认前缀和为 0 的情况有一个,但这里注意我们的后面一个 int 是存下标的
        int sum = 0, ret = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i] == 0 ? -1 : 1; // 计算当前位置的前缀和,并且数组中为 0 的改成 -1
            if (hash.count(sum)) 
                ret = max(ret, i - hash[sum]);
            else 
                hash[sum] = i;
        }
        return ret;
    }
};

算法总结 && 笔记展示

在这里插入图片描述


32. 矩阵区域和

题目链接:

1314. 矩阵区域和 - 力扣(LeetCode)

题目描述:

在这里插入图片描述

题目示例:

解法

算法思路

二维前缀和的简单应用题,关键就是我们在填写结果矩阵的时候,要找到原矩阵对于区域的【左上角】以及【右下角】的坐标(大家可以画图,我后面的笔记里会有)。

  • 左上角坐标:x1 = i - k,y1 = j - k,但是由于会【超过矩阵】的范围,因此需要对 0 取一个 max。因此修正后的坐标为:x1 = max(0, i-k),y1 = max(0, j-k);
  • 右下角坐标:x2 = i + k,y2 = j + k,但是由于会【超过矩阵】的范围,因此需要对 m - 1,以及 n-1 取一个 min。因此修正后的坐标为:x2 = min(m-1, i+k),y2 = min(n-1, j+k)。

然后将求出来的坐标代入到【二维前缀和矩阵】的计算公式上即可~(但是要注意下标的映射关系,这个这里就不仔细讲了,下面也会在笔记中展示出来)

C++ 算法代码

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));
        vector<vector<int>> answer(m, vector<int>(n));
        
        // 预处理出来一个 dp 数组
        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];
        
        // 使用 dp 数组
        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;
                answer[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
            }
        return answer;
    }
};

算法总结 && 笔记展示

在这里插入图片描述

在这里插入图片描述

目录

  1. 前言
  2. 31. 连续数组
  3. 解法(前缀和 + 哈希表)
  4. 算法思路
  5. C++ 算法代码
  6. 算法总结 && 笔记展示
  7. 32. 矩阵区域和
  8. 解法
  9. 算法思路
  10. C++ 算法代码
  11. 算法总结 && 笔记展示
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw Gateway 安装失败:systemctl --user unavailable 排查与解决
  • C++ 火柴人跑酷游戏开发流程详解
  • 使用 Web Scraper 插件抓取知乎评论数据实战
  • WeBASE 一键部署实战:Ubuntu 环境配置与常见问题解决
  • 基于腾讯云轻量应用服务器部署 OpenClaw 并接入 IM 机器人
  • browser-use + web-ui 大模型实现自动操作浏览器
  • C++ 编程核心机制与工程实践详解
  • AI 写作核心算法解析:从生成式模型到 Transformer
  • 医疗 AI 场景下算法编程深度解析
  • 英伟达与 GitHub 免费大模型 API Key 获取实战
  • Linux 进程间通信实战:命名管道(FIFO)详解
  • 步进电机在创客项目中的72变:从3D打印到智能家居的跨界实践
  • 字符串算法基础:暴力搜索、KMP 与编辑距离
  • 前端拖拽排序实现详解:从原理到实践
  • Android 开发无工作经验求职指南
  • 大模型 AI 产品经理学习路线:从基础到实战
  • C++ 栈模拟验证栈序列:LeetCode 946 题解
  • OpenClaw 联网工具完全指南:最大化 AI 实时信息获取能力
  • 低成本运行 Claude Code:通过 LiteLLM 接入 GitHub Copilot Chat API
  • 基于 Rokid AR 眼镜的聚会游戏助手开发实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online