当前位置: 首页 > news >正文

【0基础学算法】前缀和刷题日志(三):连续数组、矩阵区域和

文章目录

    • 连续数组(medium)
      • 题目链接
      • 题目描述
      • 解法
    • 矩阵区域和(medium)
      • 题目链接
      • 题目描述
      • 解法


连续数组(medium)

题目链接

525. 连续数组

题目描述

在这里插入图片描述

解法

本题解题关键在于将原数组的0转化-1
此时问题就简化为:求最长和为0的子数组的长度

该题与求和为k的子数组就非常类似了
此题的算法原理上篇文章有讲解:0基础学算法】前缀和刷题日志(二):前缀和与子数组的心动瞬间

但还是有很多细节需要注意

前缀和+哈希表

  1. 设i 为数组中的任意位置,⽤sum[i] 表⽰[0, i] 区间内所有元素的和(前缀和)
  2. 在区间[0, i-1]中,有多少个前缀和为sum[i],那么就有多少个符合条件的以i为结尾的子数组。
    在这里插入图片描述
  3. 这里哈希表中存什么?
    key存前缀和,value存下标(用于求子数组长度)

细节问题

  1. 前缀和存入哈希表的时机
    前缀和使用完后,再存入哈希表
  2. 如果有重复的(等值的)前缀和需要存入哈希表,如何选取?
    选择先存入的前缀和,因为遍历数组从左往右,前缀和越靠左,得到的目标子数组就越长。
  3. 边界情况:如果前缀和为0,该如何?
    预先存入哈希表,下标设置为-1。即hash[0] = -1
  4. 长度如何计算?
    在这里插入图片描述
    代码(C++)
class Solution {
public:int findMaxLength(vector<int>& nums) {//问题转化:求最长和为0的子数组int sum = 0, ret = 0;unordered_map<int, int> hash;//边界情况:sum == 0hash[0] = -1;for(int i = 0; i < nums.size(); ++i){//0->-1sum += nums[i] == 0 ? -1 : 1;//当前前缀和if(hash.count(sum)) ret = max(ret, i - hash[sum]);else hash[sum] = i;}return ret;}
};

矩阵区域和(medium)

题目链接

1314. 矩阵区域和

题目描述

在这里插入图片描述

解法

二维前缀和

二维数组前缀和递推公式:
在这里插入图片描述
算法原理

  1. 使用前缀和求区域和方式如下:
    在这里插入图片描述

  2. 也就是说,只需确定所求目标区域的左上角和右下角元素坐标即可利用前缀和矩阵求得一个区域和

  3. 求左上角和右下角元素的坐标:
    在这里插入图片描述
    可得:

    • x1 = max(0, i-k)
    • y1 = max(0, j-k)
    • x2 = min(n-1, i+k)
    • y2 = min(m-1, j+k)
  4. 下标映射关系

  • 因此我们递推dp时:mat[i][j]改为mat[i-1][j-1]
  • 求区域和时:
    • x1 = max(0, i-k)+1
    • y1 = max(0, j-k)+1
    • x2 = min(n-1, i+k)+1
    • y2 = min(m-1, j+k)+1

代码(C++):

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int n = mat.size(), m = mat[0].size();//先预处理一个前缀和矩阵vector<vector<int>> dp(n+1, vector<int>(m+1));for(int i = 1; i < n+1; ++i){for(int j = 1; j < m+1; ++j)dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + mat[i-1][j-1];}//使用前缀和矩阵求区域和vector<vector<int>> answer(n, vector<int>(m));for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){int x1 = max(0, i-k) + 1;int y1 = max(0, j-k) + 1;int x2 = min(n-1, i+k) + 1;int y2 = min(m-1, j+k) + 1;answer[i][j] = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1];}}return answer;}
};

前缀和完~

http://www.dtcms.com/a/548855.html

相关文章:

  • 学习网站建设与管理汉沽集团网站建设
  • 10月30日
  • ESP32开发指南(基于IDF):连接AWS,乐鑫官方esp-aws-iot-master例程实验、跑通
  • Cocos资源加密方案解析
  • 从零开始的云原生之旅(六):DaemonSet 实战日志采集器
  • 网站建设人员任职要求电器类网站设计
  • [论文阅读] AI + Debug | 基于大语言模型的GitHub故障复现测试用例生成方法解析
  • 关于App的gradle降级问题的总结
  • 从零开始的云原生之旅(四):K8s 工作负载完全指南
  • 论文阅读笔记——自注意力机制
  • Xsens动作捕捉系统:训练、实时控制机器人
  • iOS 26 性能监控工具有哪些?多工具协同打造全方位性能分析体系
  • 做网站公司合同最新网站建设进程
  • 佳木斯做网站公司wordpress模板视频教程
  • viewerjs+vue3 using javascript
  • 2.游戏逆向-pxxx-分析UE源码中的GName
  • 编程与数学 03-007 《看潮资源管理器》项目开发 18 文件夹操作(2-2)
  • 服务器镜像安全:Docker 镜像漏洞扫描(Trivy)与基础镜像优化
  • Web安全深度实战:从漏洞挖掘到安全防护
  • 教育行业 | 信而泰推出Darsi通信网络与网络安全教育实验平台解决方案
  • 【Java笔记】定时器
  • ih5做的网站怎么上传seo企业网站优化
  • 刚建设的网站多久能在百度查到最美情侣高清视频播放
  • 【JavaEE初阶】TCP核心机制10——异常情况的处理
  • 阿里云ECS在线扩容磁盘
  • 私人兼职做网站开发麻章手机网站建设
  • 如何把ChatGPT嵌入到自己的应用中?
  • 豆包、元宝、Kimi等AI对话大模型会成为“带货”主流吗?
  • 仓颉语言中流式I/O的设计模式深度剖析
  • 51单片机基础-IO扩展(并转串 74HC165)