1. 问题背景与核心挑战
今天想和大家聊聊LeetCode上两个经典的热门题目——"和为K的子数组"和"滑动窗口的最大值"。这两个问题看似简单,但实际考察了我们对数组操作、算法优化的深入理解。作为面试中的常客,它们能很好地检验候选人对基础数据结构的掌握程度和算法思维。
先说说第一个问题"和为K的子数组":给定一个整数数组和一个目标值K,我们需要找出数组中连续子数组的和等于K的所有可能情况。这个问题看似可以用暴力解法,但如何在O(n)时间复杂度内解决才是真正的挑战。
第二个问题"滑动窗口的最大值":给定一个数组和滑动窗口的大小,我们需要找出窗口每次滑动时的最大值。这个问题在实时数据处理、股票分析等场景中都有实际应用价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 和为K的子数组解法详解
2.1 暴力解法及其局限性
最直观的解法当然是暴力枚举:
python复制def subarraySum(nums, k):
count = 0
for i in range(len(nums)):
sum = 0
for j in range(i, len(nums)):
sum += nums[j]
if sum == k:
count += 1
return count
这个解法的时间复杂度是O(n²),对于大规模数据显然不够高效。
2.2 前缀和+哈希表的优化解法
更聪明的做法是利用前缀和配合哈希表:
python复制def subarraySum(nums, k):
count = 0
sum = 0
prefix_sum = {0:1}
for num in nums:
sum += num
if sum - k in prefix_sum:
count += prefix_sum[sum - k]
prefix_sum[sum] = prefix_sum.get(sum, 0) + 1
return count
这个算法的核心思想是:如果存在一个前缀和sum[j]使得sum[
