《算法题讲解指南:优选算法-前缀和》--31.连续数组,32.矩阵区域和

《算法题讲解指南:优选算法-前缀和》--31.连续数组,32.矩阵区域和

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

31. 连续数组

题目链接:

题目描述:

题目示例:

解法(前缀和+哈希表):

算法思路:

C++算法代码:

算法总结及流程解析:

32. 矩阵区域和

题目链接:

题目描述:

题目示例:

解法:

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


31. 连续数组

题目链接:

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

题目描述:

题目示例:

解法(前缀和+哈希表):

算法思路:

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

  • 本题让我们找出一段连续的区间,0和1出现的次数相同。
  • 如果将0记为-1,1记为1,问题就变成了找出一段区间,这段区间的和等于0
  • 于是,就和之前做过的那个和为 k 的子数组的题思路类似了

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

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

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

C++算法代码:

class Solution { public: int findMaxLength(vector<int>& nums) { unordered_map<int, int> hash; int len = 0; int sum = 0; hash[0] = -1; for(int i = 0; i < nums.size(); i++) { if(nums[i] == 0) { nums[i] = -1; } sum += nums[i]; if(hash.count(sum)) { len = max(len, i - hash[sum]); } else //当第一次遇见前缀和则哈希表存放对应的下标(保证长度最短) { //如果是重复遇见相同的前缀和,则只更新长度不存放到哈希表 //因为重复遇见的前缀和长度一定比第一次长,无需存放 hash[sum] = i; } } return len; } };

算法总结及流程解析:

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(); int n = mat[0].size(); vector<vector<int>> sums(m + 1, vector<int>(n + 1, 0)); vector<vector<int>> ret(m, vector<int>(n, 0)); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { sums[i + 1][j + 1] = mat[i][j] + sums[i][j + 1] + sums[i + 1][j] - sums[i][j]; } } for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { //max和min是为了处理越界情况 ret[i][j] = sums[min(m, i + 1 + k)][min(n, j + 1 + k)] - sums[max(0, i - k)][min(n, j + 1 + k)] - sums[min(m, i + 1 + k)][max(0, j - k)] + sums[max(0, i - k)][max(0, j - k)]; //i + 1和j + 1的目的就是为了和mat进行映射关系,sums[i + 1][j + 1] -> mat[i][j] //然后i - k实际上是i + 1 - k - 1,i + 1依然是与mat进行映射关系 } } return ret; } };

算法总结及流程解析:

结束语

      到此,31.连续数组,32.矩阵区域和 这两道算法题就讲解完了。连续数组 将0/1转换后用前缀和+哈希表寻找和为0的最长子数组;矩阵区域和 通过二维前缀和快速计算矩阵区域和,注意处理边界条件。希望大家能有所收获!

Read more

AI绘画新手必看:Face Fusion融合技巧,5分钟快速入门

AI绘画新手必看:Face Fusion融合技巧,5分钟快速入门 你是不是也和我一样,是个热爱插画创作的美术人?最近AI绘画火得一塌糊涂,朋友圈里大家都在晒“AI+手绘”作品,风格独特、效率翻倍。你也想试试,朋友还特别推荐了一个叫 Face Fusion 的工具,说它能做超自然的人脸风格迁移——比如把你画的角色脸,换成梵高笔触、赛博朋克风,甚至皮克斯动画感! 可当你兴冲冲下载软件,发现自己的Mac Mini根本跑不动——没独立显卡,CUDA不支持,安装教程全是命令行,论坛里一堆人在抱怨“配置失败”“显存不足”“Python报错”。那一刻,你是不是开始怀疑:这玩意儿真的适合我们普通人吗?难道AI辅助创作,只有程序员和高端PC玩家才能玩? 别急,今天我就来告诉你一个零门槛上手Face Fusion的方法,不用买新电脑、不用装Docker、不用懂代码,5分钟就能启动Web界面,直接上传图片做融合。关键是你用的还是真正的GPU加速环境,效果流畅、生成快、质量高。

By Ne0inhk
【hacker送书第15期】AI绘画精讲与AIGC时代游戏美术设计:从入门到精通

【hacker送书第15期】AI绘画精讲与AIGC时代游戏美术设计:从入门到精通

文章目录 * 😊前言 * AI绘画精讲:Stable Diffusion从入门到精通💕 * 内容简介 * 获取方式 * AIGC时代:游戏美术设计与AI绘画应用从入门到精通💕 * 内容简介 * 获取方式 * 😊总结 😊前言 随着人工智能技术的飞速发展,AI绘画已经成为了一个备受瞩目的领域。在这个背景下,北京大学出版社推出了一系列关于AI绘画的优秀图书,其中就包括了《AI绘画精讲:Stable Diffusion从入门到精通》和《AIGC时代:游戏美术设计与AI绘画应用从入门到精通》。这两本书都是为了帮助读者全面了解和掌握AI绘画的精髓,推动人工智能技术在艺术领域的应用发展。 AI绘画精讲:Stable Diffusion从入门到精通💕 内容简介 Stable Diffusion是一款非常受欢迎的 AI 绘画与设计软件。AI绘画和传统绘画有什么不同、AI 绘画的基本逻辑是什么、如何让 AI 绘画软件为我们工作、如何生成符合要求的作品,本书将一一进行解析。 本书共 13 章内容。首先循序渐进地介绍了 A

By Ne0inhk

WIN11必备!QTTabBar中文优化版保姆级安装教程(含常见问题解决)

WIN11效率革命:深度定制你的资源管理器,不止于多标签 如果你和我一样,每天要在Windows的资源管理器里花费大量时间,那你一定对那种反复在层层文件夹中穿梭、找不到上一个窗口的体验深恶痛绝。系统自带的文件管理工具,就像一个功能简陋的毛坯房,勉强能用,但毫无效率与舒适度可言。尤其是升级到WIN11后,虽然界面更现代,但核心的文件管理逻辑依然停留在上个时代,对于追求效率的用户来说,这无疑是一种巨大的生产力损耗。 这篇文章,就是为那些不愿忍受现状,但又不想投入过多精力去学习复杂新软件的WIN10/WIN11用户准备的。我们不讨论那些需要彻底改变操作习惯的“重型”第三方管理器,而是聚焦于一种更优雅、更无感的解决方案:增强你正在使用的资源管理器本身。今天的主角,是一个经过国内开发者精心“魔改”的经典工具——QTTabBar的中文优化版。它就像给你的文件管理器做了一次精装修,保留了熟悉的格局,却赋予了它全新的、高效的能力。接下来,我将带你从零开始,完成这次效率升级,并深入探讨如何根据你的习惯,将它调校成最趁手的工具。 1. 为什么选择增强,而非替换? 在深入安装细节之前,我们有必要先

By Ne0inhk
Neo4j插件apoc安装及配置(实战经历,一步到位)

Neo4j插件apoc安装及配置(实战经历,一步到位)

目录 apoc插件安装 安装验证 出现的问题 Neo4j版本:Neo4j 5.x apoc版本:同上对应 Neo4j 4.x版本同样适用 apoc插件安装 1.首先查看Neo4j版本(在Neo4j Desktop或命令行中执行): CALL dbms.components() YIELD name, versions RETURN versions;  结果如下: 2.然后去GitHub上下载这个插件 * 访问 APOC GitHub Releases------------ https://github.com/neo4j/apoc/releases/ * 下载与Neo4j版本一致的apoc-x.x.x.x-all.jar文件(例如Neo4j 5.12.0 → APOC 5.

By Ne0inhk