题目
给定一个数组 nums 和一个目标值 k,找到和等于*
k
* 的最长连续子数组长度。如果不存在任意一个符合要求的子数组,则返回0
。
解题
python
"""
时间复杂度: O(n),因为我们只遍历一次数组。
空间复杂度: O(n),用于存储前缀和及其对应的位置。
"""
def maxSubArrayLen(nums, k):
prefix_sums = {0: -1} # 初始化哈希表,前缀和为 0 时索引为 -1
current_sum = 0
max_length = 0
for i, num in enumerate(nums):
current_sum += num
# 检查是否存在前缀和,使得 current_sum - previous_sum = k
if 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] = i
return 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