当前位置: 面试刷题>> 最大子数组之和为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 示例代码

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 示例代码

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 示例代码

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中的关联数组)来优化查找过程。

推荐面试题