当前位置: 面试刷题>> 最大子数组之和为k (经典算法题500道)


### 题目描述补充 **题目:最大子数组之和为k** 给定一个整数数组`nums`和一个整数`k`,请找到`nums`中和为`k`的连续子数组的最大长度。如果没有找到符合条件的子数组,则返回0。 **示例 1**: ``` 输入: nums = [1, -1, 5, -2, 3], k = 3 输出: 4 解释: 子数组 [1, -1, 5, -2] 的和为 3,且长度为 4。 ``` **示例 2**: ``` 输入: nums = [-2, -1, 2, 2], k = 3 输出: 0 解释: 没有和为 3 的子数组。 ``` ### PHP 示例代码 ```php function maxSubArrayLen($nums, $k) { $prefixSum = array_fill(0, count($nums) + 1, 0); // 前缀和数组,并初始化为0,prefixSum[0]为哨兵 $sumMap = array(); // 存储前缀和对应的索引,用于快速查找 $sumMap[0] = 0; // 初始化前缀和为0的索引为0 $maxLength = 0; $currentSum = 0; for ($i = 0; $i < count($nums); $i++) { $currentSum += $nums[$i]; if (isset($sumMap[$currentSum - $k])) { // 如果存在前缀和等于currentSum - k,说明当前位置到该前缀和位置的子数组和为k $maxLength = max($maxLength, $i - $sumMap[$currentSum - $k] + 1); } if (!isset($sumMap[$currentSum])) { // 如果当前前缀和第一次出现,则记录其索引 $sumMap[$currentSum] = $i + 1; } } return $maxLength; } // 测试 $nums = [1, -1, 5, -2, 3]; $k = 3; echo maxSubArrayLen($nums, $k); // 输出 4 ``` ### Python 示例代码 ```python def maxSubArrayLen(nums, k): prefix_sum = [0] * (len(nums) + 1) sum_map = {0: 0} # 前缀和为0的索引为0 max_length = 0 current_sum = 0 for i in range(len(nums)): current_sum += nums[i] if current_sum - k in sum_map: max_length = max(max_length, i - sum_map[current_sum - k] + 1) if current_sum not in sum_map: sum_map[current_sum] = i + 1 return max_length # 测试 nums = [1, -1, 5, -2, 3] k = 3 print(maxSubArrayLen(nums, k)) # 输出 4 ``` ### JavaScript 示例代码 ```javascript function maxSubArrayLen(nums, k) { const prefixSum = [0]; const sumMap = new Map(); sumMap.set(0, 0); let maxLength = 0; let currentSum = 0; for (let i = 0; i < nums.length; i++) { currentSum += nums[i]; if (sumMap.has(currentSum - k)) { maxLength = Math.max(maxLength, i - sumMap.get(currentSum - k) + 1); } if (!sumMap.has(currentSum)) { sumMap.set(currentSum, i + 1); } } return maxLength; } // 测试 const nums = [1, -1, 5, -2, 3]; const k = 3; console.log(maxSubArrayLen(nums, k)); // 输出 4 ``` 以上代码示例展示了如何在PHP、Python和JavaScript中实现找到和为`k`的连续子数组的最大长度。每种语言都使用了前缀和和哈希表(或PHP中的关联数组)来优化查找过程。