当前位置: 面试刷题>> 连续子数组求和 (经典算法题500道)


### 题目描述 给定一个整数数组 `nums` 和一个目标值 `k`,请找出该数组中所有和为 `k` 的连续子数组,并返回这些子数组的起始与结束索引(包含)。数组的下标从 0 开始。 **示例 1**: ``` 输入: nums = [1,2,3], k = 3 输出: [[0,2]] 解释: 只有一个子数组 [1, 2, 3] 的和为 3,其起始和结束索引为 [0, 2]。 ``` **示例 2**: ``` 输入: nums = [1,-1,0], k = 0 输出: [[0,1], [1,2], [0,2]] 解释: 子数组 [1, -1]、[-1, 0] 和 [1, -1, 0] 的和都为 0。 ``` ### PHP 示例代码 ```php function subarraySum($nums, $k) { $result = []; $sum = 0; $prefixSum = []; $prefixSum[0] = -1; // 初始化前缀和为0的索引为-1,用于处理从数组开头开始的子数组 for ($i = 0; $i < count($nums); $i++) { $sum += $nums[$i]; if (isset($prefixSum[$sum - $k])) { // 如果之前有过相同的前缀和,则当前位置与那个位置的索引差即为子数组的起始和结束索引 foreach ($prefixSum[$sum - $k] as $prevIndex) { $result[] = [$prevIndex + 1, $i]; } } if (!isset($prefixSum[$sum])) { $prefixSum[$sum] = []; } $prefixSum[$sum][] = $i; // 记录当前位置作为某个前缀和的索引 } return $result; } // 示例 $nums = [1, -1, 0]; $k = 0; print_r(subarraySum($nums, $k)); ``` ### Python 示例代码 ```python def subarraySum(nums, k): result = [] current_sum = 0 prefix_sum = {0: -1} # 初始化前缀和为0的索引为-1 for i, num in enumerate(nums): current_sum += num if current_sum - k in prefix_sum: result.append([prefix_sum[current_sum - k] + 1, i]) if current_sum not in prefix_sum: prefix_sum[current_sum] = i return result # 示例 nums = [1, -1, 0] k = 0 print(subarraySum(nums, k)) ``` ### JavaScript 示例代码 ```javascript function subarraySum(nums, k) { const result = []; let currentSum = 0; const prefixSum = { 0: -1 }; // 初始化前缀和为0的索引为-1 for (let i = 0; i < nums.length; i++) { currentSum += nums[i]; if (prefixSum[currentSum - k] !== undefined) { // 如果存在相同的前缀和,则添加起始和结束索引 for (const prevIndex of prefixSum[currentSum - k]) { result.push([prevIndex + 1, i]); } } if (prefixSum[currentSum] === undefined) { prefixSum[currentSum] = []; } prefixSum[currentSum].push(i); // 记录当前位置 } return result; } // 示例 const nums = [1, -1, 0]; const k = 0; console.log(subarraySum(nums, k)); ``` **码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法基础、数据结构、面试题解析等,帮助大家提升编程能力。
推荐面试题