1. 前缀和算法基础与应用场景
前缀和(Prefix Sum)是算法领域中一种极为实用的预处理技术,它通过预先计算并存储数组的累积和,将许多原本需要O(n²)时间复杂度的子数组求和问题优化至O(n)级别。这种思想在解决连续子数组相关问题时展现出惊人的效率提升。
1.1 前缀和的核心思想
前缀和的本质是空间换时间的典型应用。给定一个数组nums,我们构建一个前缀和数组prefix,其中prefix[i]表示nums从第0个元素到第i-1个元素的和(根据实现方式不同,索引可能有变化)。数学表达式为:
code复制prefix[0] = 0
prefix[i] = prefix[i-1] + nums[i-1] (i > 0)
这种预处理带来的直接好处是:任何子数组nums[i..j]的和都可以在O(1)时间内通过prefix[j+1] - prefix[i]计算得出。这彻底避免了每次查询时都需要遍历子数组的重复计算。
1.2 哈希表的协同增效
单纯使用前缀和数组只能解决部分基础问题。当问题升级为"统计满足特定条件的子数组数量"时,哈希表的引入就变得至关重要。哈希表在这里扮演着"记忆装置"的角色,它实时记录遍历过程中各种前缀和值出现的次数,使得我们可以在O(1)时间内查询到历史信息。
这种组合技的典型应用场景包括:
- 寻找和为特定值的子数组
- 寻找满足特定数学关系的子数组(如可被k整除)
- 统计满足复杂条件的子数组数量
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 和为K的子数组深度解析
2.1 问题重述与暴力解法
LeetCode第560题要求:给定一个整数数组nums和一个整数k,返回该数组中和为k的连续子数组的个数。
最直观的暴力解法是枚举所有可能的子数组,然后计算它们的和。这种方法需要双重循环,时间复杂度为O(n²),在数组较大时(如n=10^5)会完全无法接受。
2.2 前缀和+哈希表的优化思路
优化关键在于认识到:子数组和sum[i..j]可以表示为prefix[j] - prefix[i-1]。我们希望这个差值等于k,即:
code复制prefix[j] - prefix[i-1] = k
这可以变形为:
code复制prefix[i-1] = prefix[j] - k
这意味着,在遍历数组计算prefix
