第一种可以考虑将任意L到R的累加结果映射成为一个二维数组,再通过对二维数组的直接查询可以访问到任意数组下标的范围累加和(L <= R),具体Python代码实现如下:
arr = [3,4,2,1,6,7,8] # 如果总是频繁查询L到R的累加和,怎么办? # 第一种方法:建立以L和R为边的二维数组 # 0 1 2 3 4 5 6 # 0 # 1 # 2 # 3 # 4 # 5 # 6 def GetRangeSum1(arr,L,R): arrNew = [['X'] * len(arr) for i in range(len(arr))] for i in range(0,len(arr),1): for j in range(i,len(arr),1): start = i end = j arrNew[i][j] = 0 while start <= end: arrNew[i][j] += arr[start] start += 1 print('生成二维数组如下:') for i in range(0,len(arr),1): for j in range(0,len(arr),1): print(arrNew[i][j],end='\t') print('') print(f'{L}到{R}范围内的加和为{arrNew[L][R]}')
GetRangeSum1(arr,2,5)
print('==================================================')
执行结果如下:
生成二维数组如下:
3 7 9 10 16 23 31
X 4 6 7 13 20 28
X X 2 3 9 16 24
X X X 1 7 14 22
X X X X 6 13 21
X X X X X 7 15
X X X X X X 8
2到5范围内的加和为16
==================================================
第二种可以采用前缀和的方法,具体Python代码如下:
# 第二种方法 前缀和 # help = [3,7,9,10,16,23,31] # L == 0 ans = H[R] # L != 0 H[R] - H[L-1] def GetRangeSum2(arr,L,R): arrNew = [0 for i in range(len(arr))] i = 1 arrNew[0] = arr[0] while i < len(arr): preValue = arrNew[i-1] arrNew[i] = preValue + arr[i] i += 1 print('生成的前缀和一维数组如下:') print(arrNew) if L == 0: print(f'{L}到{R}的范围和为{arrNew[R]}') else: print(f'{L}到{R}的范围和为{arrNew[R] - arrNew[L-1]}') GetRangeSum2(arr,1,4)
执行结果如下:
生成的前缀和一维数组如下:
[3, 7, 9, 10, 16, 23, 31]
1到4的范围和为13
两种方法比较:若重复次数特别多,法1更合适,其他多数情况,2较为合适