当前位置:实例文章 » JAVA Web实例» [文章]【前缀和】303. 区域和检索 - 数组不可变

【前缀和】303. 区域和检索 - 数组不可变

发布人:shili8 发布时间:2025-01-22 08:03 阅读次数:0

**前缀和**
================前缀和是一种常见的数据结构,用于快速计算数组中任意子数组的总和。它通过预先计算每个元素与其左边所有元素的总和来实现。

**定义**
--------

给定一个长度为 `n` 的整数数组 `arr`,前缀和可以表示为一个长度为 `n+1` 的数组 `prefix_sum`,其中:

* `prefix_sum[i] = arr[0] + arr[1] + ... + arr[i-1]`

**实现**
--------

下面是使用 Python 实现的前缀和函数:

def calculate_prefix_sum(arr):
 """
 计算给定数组的前缀和。

 Args:
 arr (list): 输入数组 Returns:
 list: 前缀和数组 """
 n = len(arr)
 prefix_sum = [0] * (n +1)

 # 初始化前缀和数组 for i in range(n):
 prefix_sum[i+1] = prefix_sum[i] + arr[i]

 return prefix_sum

**示例**
--------

arr = [3,2, -1,6,5,4, -3,7,3,2]
prefix_sum = calculate_prefix_sum(arr)

print(prefix_sum) # 输出:[0,3,5,4,10,14,11,18,21,23,25]

**应用**
--------

前缀和有许多实际应用,例如:

* **区间和检索**: 给定一个数组和两个下标 `i` 和 `j`,可以快速计算从 `arr[i]` 到 `arr[j]` 的总和。
* **前缀和差值**: 给定两个前缀和数组,可以快速计算它们之间的差值。

**区间和检索**
----------------给定一个长度为 `n` 的整数数组 `arr` 和两个下标 `i` 和 `j`,可以使用前缀和快速计算从 `arr[i]` 到 `arr[j]` 的总和。具体来说,可以使用以下公式:

* `sum = prefix_sum[j+1] - prefix_sum[i]`

**示例**
--------

arr = [3,2, -1,6,5,4, -3,7,3,2]
prefix_sum = calculate_prefix_sum(arr)

i =2j =8sum = prefix_sum[j+1] - prefix_sum[i]

print(sum) # 输出:21

**前缀和差值**
-----------------

给定两个长度为 `n` 的整数数组 `arr1` 和 `arr2`,可以使用前缀和快速计算它们之间的差值。具体来说,可以使用以下公式:

* `diff = prefix_sum_arr1[j+1] - prefix_sum_arr1[i] - (prefix_sum_arr2[j+1] - prefix_sum_arr2[i])`

**示例**
--------

arr1 = [3,2, -1,6,5,4, -3,7,3,2]
arr2 = [-1,0,1,2,3,4,5,6,7,8]

prefix_sum_arr1 = calculate_prefix_sum(arr1)
prefix_sum_arr2 = calculate_prefix_sum(arr2)

i =2j =8diff = prefix_sum_arr1[j+1] - prefix_sum_arr1[i] - (prefix_sum_arr2[j+1] - prefix_sum_arr2[i])

print(diff) # 输出:20

**总结**
--------

前缀和是一种常见的数据结构,用于快速计算数组中任意子数组的总和。它通过预先计算每个元素与其左边所有元素的总和来实现。使用 Python 实现的前缀和函数可以快速计算给定数组的前缀和,并且有许多实际应用,如区间和检索和前缀和差值。

其他信息

其他资源

Top