题目
给定一个数组
nums
和一个目标值k
,找到和等于k
的最长连续子数组长度。如果不存在任意一个符合要求的子数组,则返回0
。
解题
"""
时间复杂度: O(n),因为我们只遍历一次数组。
空间复杂度: O(n),用于存储前缀和及其对应的位置。
"""def maxSubArrayLen(nums, k):prefix_sums = {0: -1} # 初始化哈希表,前缀和为 0 时索引为 -1current_sum = 0max_length = 0for i, num in enumerate(nums):current_sum += num# 检查是否存在前缀和,使得 current_sum - previous_sum = kif current_sum - k in prefix_sums:max_length = max(max_length, i - prefix_sums[current_sum - k])# 仅在哈希表中记录前缀和首次出现的位置if current_sum not in prefix_sums:prefix_sums[current_sum] = ireturn max_length# 示例 1
nums = [1, -1, 5, -2, 3]
k = 3
print(maxSubArrayLen(nums, k)) # 输出: 4# 示例 2
nums = [-2, -1, 2, 1]
k = 1
print(maxSubArrayLen(nums, k)) # 输出: 2