news 2026/5/25 12:00:01

连续数组(哈希+前缀和)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
连续数组(哈希+前缀和)

这道题可以利用前缀和 + 哈希表来解决。

1.将 0 视为 -1

题目要求找“0 和 1 数目相等”的最长子数组。
如果把数组中的0当作-1,那就等价于:

找到一个子数组,使得这个子数组的元素和为 0。

2.使用哈希表记录前缀和第一次出现的位置

prefixSum为从数组开始到当前的前缀和。

unordered_map<int, int> index存储:

<前缀和,第一次出现的下标>

为什么存第一次出现的位置?
因为前缀和越早出现,后续遇到相同前缀和时形成的子数组就越长。

3.遍历数组时更新前缀和

扫描数组:

  • 遇到1:prefixSum += 1

  • 遇到0:prefixSum -= 1

每一步都检查:

如果当前前缀和 prefixSum 曾经出现过:

说明:

两次出现 prefixSum 之间的子数组和为 0
→ 0 和 1 的数量相等

于是可以计算当前长度并更新答案。

如果此前没有出现过 prefixSum:

记录当前下标(只记录第一次出现的位置)。

4.初始化 index[0] = -1

为了处理从下标0开始就满足条件的情况。

通过将 0 当作 -1,我们把问题转化为寻找“和为 0 的最长子数组”。
使用哈希表记录每个前缀和第一次出现的位置。当同一个前缀和再次出现时,说明中间的子数组和为 0,即 0 和 1 数量相等,从而可以更新最大长度。

class Solution { public: int findMaxLength(vector<int>& nums) { int cnt=0; unordered_map<int,int> index; index[cnt]=-1; int maxLen=0; for(int i=0;i<nums.size();i++){ if(nums[i]==1) cnt++; else cnt--; if(index.count(cnt)){ int curLen=i-index[cnt]; maxLen=maxLen>curLen?maxLen:curLen; } else index[cnt]=i; } return maxLen; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 7:35:58

iOS 应用发布流程中常被忽视的关键环节

在很多项目里&#xff0c;“发布 iOS 应用”经常被视为开发结束后的自然延伸。但当你真正负责一次完整发布时&#xff0c;很快会意识到&#xff0c;这并不是一个单点操作&#xff0c;而是一段横跨多个工具、多个系统、多个角色的工程过程。 我第一次完整跑完 iOS 发布全流程时&…

作者头像 李华
网站建设 2026/5/26 7:22:39

什么是云桌面?一般都用哪些云桌面?

随着数字化时代的快速发展&#xff0c;云计算技术逐渐渗透到各行各业&#xff0c;其中云桌面作为一种创新的工作与学习方式&#xff0c;正受到广泛关注。它不仅提升了资源利用效率&#xff0c;还增强了数据安全性和访问灵活性。特别是在教育领域&#xff0c;结合人工智能技术的…

作者头像 李华
网站建设 2026/5/26 7:21:59

什么是云原生

云原生是一种现代化的软件开发和部署方法&#xff0c;旨在充分利用云计算的优势&#xff0c;提高应用程序的可伸缩性、弹性和可靠性。 云原生的详细定义包括云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;的官方定义和延伸含义。…

作者头像 李华