当前位置: 面试刷题>> 连续子数组求和 (经典算法题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));
```
**码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法基础、数据结构、面试题解析等,帮助大家提升编程能力。