算法题(Python)数组篇 | 6.区间和

算法题(Python)数组篇 | 6.区间和

一、题目描述

给定一个整数数组Array,请计算该数组在每个指定区间内元素的总和。

输入描述:

复制代码
第一行输入为整数数组Array的长度n,接下来n行,每行一个整数,表示数组的元素。
随后的输入为需要计算总和的区间下标:a,b(b >= a),直至结束 

输出描述:

复制代码
输出每个指定区间内元素的总和。

二、思路

首先看到本题时的最直观的想法是暴力解法,即:给一个区间,把这个区间的和都累加一遍即可,代码如下:

python 复制代码
if __name__ == "__main__":
    n = int(input())
    nums = [0] * n
    for i in range(0, n):
        nums[i] = int(input())
    while True:
        try:
            a, b = map(int, input().split())
            sum = 0
            for i in range(a, b + 1):
                sum += nums[i]
            print(sum)
        except:
            break

但是提交代码后,存在超时问题:

举一个极端的例子,如果我查询m次,每次查询的范围都是从0到n-1,那么该算法的时间复杂度是 O ( n × m ) O(n \times m) O(n×m)。如果查询次数非常大的话,这个时间复杂度会很高。

因此,通过此题引入前缀和概念,前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。

前缀和 在涉及计算区间和的问题时非常有用!

示例:假设我们要统计nums[i]这个数组上的区间和。我们先做累加,即p[i]表示下标0到i的nums[i]累加之和。

如果,我们想统计nums数组上下标2到下标5之间的累加和,是不是用p[5]-p[1]即可:

p[1] = nums[0] + nums[1]

p[5] = nums[0] + nums[1] + nums[2] + nums[3] + nums[4] + nums[5]

p[5] - p[1] = nums[2] + nums[3] + nums[4] + nums[5]

如下图所示,p[5] - p[1]就是绿色部分的区间和,而p数组是之前计算好的累加和,所以后面每次求区间和之后,只需要 O ( 1 ) O(1) O(1)操作。

本题代码如下:

python 复制代码
if __name__ == "__main__":
    n = int(input())
    nums = [0] * n
    p = [0] * n
    presum = 0
    for i in range(0, n):
        nums[i] = int(input())
        presum += nums[i]
        p[i] = presum
    while True:
        try:
            sum = 0
            a, b = map(int, input().split())
            if a == 0:
                sum = p[b]
            else:
                sum = p[b] - p[a - 1]
            print(sum)
        except:
            break
相关推荐
naruto_lnq5 分钟前
C++中的工厂方法模式
开发语言·c++·算法
没事儿写两篇8 分钟前
Python 包管理工具-uv
python·uv·开源包管理工具
2501_9414185510 分钟前
基于YOLO11-C3k2-ESC的避雷器外部缺陷检测实现
python
流㶡10 分钟前
Python爬虫:POST与Selenium
爬虫·python·selenium
千逐-沐风15 分钟前
SMU-ACM2026冬训周报2nd
算法
爱学习的阿磊18 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
Sagittarius_A*38 分钟前
形态学与多尺度处理:计算机视觉中图像形状与尺度的基础处理框架【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉
m0_5613596741 分钟前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
2301_7903009641 分钟前
用Python实现自动化的Web测试(Selenium)
jvm·数据库·python