当前位置: 面试刷题>> 最大子数组之和为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中的关联数组)来优化查找过程。