任意数组下标L~R范围的累加和(两种Python实现方法)

第一种可以考虑将任意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较为合适

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值