当前位置: 面试刷题>> 范围加法 (经典算法题500道)
### 完整题目描述
**题目:范围加法(Range Addition)**
给定一个初始化为全零的整数数组`nums`,和一个二维数组`operations`,其中每个操作`operations[i]`包含两个整数`a[i]`和`b[i]`,表示对数组`nums`进行如下操作:将索引范围`[a[i], b[i]]`(包括`a[i]`和`b[i]`)内的所有元素都加上`c`,其中`c`是操作的第三个参数(题目简化处理,这里默认`c`为固定值,如`c=1`,但在实际应用中`c`可以是任何整数)。
要求:
1. 实现一个函数,该函数接收`nums`和`operations`作为输入,并返回进行所有操作后的`nums`数组。
2. 考虑到效率问题,尽量使用差分数组(Difference Array)或其他高效算法来减少不必要的重复操作。
### 示例
**输入**:
```
nums = [0, 0, 0, 0, 0]
operations = [[1, 2, 1], [3, 5, 2]]
```
这里默认每个操作的`c`值为操作数组中未明确给出的第三个数,但为了简化题目,我们这里默认所有操作的`c`值均为`1`。
**输出**:
```
[1, 2, 2, 3, 3]
```
解释:
- 第一个操作`[1, 2, 1]`:将索引`1`到`2`(包括)的元素都加`1`,即`nums[1]`和`nums[2]`各加`1`。
- 第二个操作`[3, 5, 2]`:但按简化处理,我们仅加`1`,因此将索引`3`到`5`(包括)的元素都加`1`,即`nums[3]`、`nums[4]`和`nums[5]`各加`1`。
### 示例代码
#### PHP
```php
function rangeAddition(array $nums, array $operations) {
$n = count($nums);
$diff = array_fill(0, $n, 0); // 初始化差分数组
foreach ($operations as $op) {
$a = $op[0];
$b = $op[1];
$c = 1; // 假设c总是1
$diff[$a] += $c;
if ($b + 1 < $n) {
$diff[$b + 1] -= $c;
}
}
// 根据差分数组恢复原始数组
$result = array_fill(0, $n, 0);
$result[0] = $diff[0];
for ($i = 1; $i < $n; $i++) {
$result[$i] = $result[$i - 1] + $diff[$i];
}
return $result;
}
// 示例
$nums = [0, 0, 0, 0, 0];
$operations = [[1, 2, 1], [3, 5, 2]]; // 注意:实际实现中只使用了前两个参数
$result = rangeAddition($nums, $operations);
print_r($result);
```
**注意**: PHP示例中,由于PHP本身不直接支持操作中的第三个参数`c`的动态读取(题目已简化为默认`c=1`),故在示例中未直接使用。
#### Python
```python
def rangeAddition(nums, operations):
n = len(nums)
diff = [0] * n
for a, b in operations:
c = 1 # 假设c总是1
diff[a] += c
if b + 1 < n:
diff[b + 1] -= c
# 根据差分数组恢复原始数组
result = [0] * n
result[0] = diff[0]
for i in range(1, n):
result[i] = result[i - 1] + diff[i]
return result
# 示例
nums = [0, 0, 0, 0, 0]
operations = [[1, 2], [3, 5]] # 注意:只传递前两个参数
result = rangeAddition(nums, operations)
print(result)
```
#### JavaScript
```javascript
function rangeAddition(nums, operations) {
const n = nums.length;
const diff = new Array(n).fill(0);
for (const [a, b] of operations) {
const c = 1; // 假设c总是1
diff[a] += c;
if (b + 1 < n) {
diff[b + 1] -= c;
}
}
// 根据差分数组恢复原始数组
const result = new Array(n).fill(0);
result[0] = diff[0];
for (let i = 1; i < n; i++) {
result[i] = result[i - 1] + diff[i];
}
return result;
}
// 示例
const nums = [0, 0, 0, 0, 0];
const operations = [[1, 2], [3, 5]]; // 注意:只传递前两个参数
const result = rangeAddition(nums, operations);
console.log(result);
```
**码小课**:以上是使用PHP、Python和JavaScript编写的范围加法问题的示例代码。在码小课网站中,你可以找到更多关于算法和数据结构的相关内容,帮助你深入学习和掌握编程技能。