算法题(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
相关推荐
Irene.ll1 小时前
DAY23
python
专注于大数据技术栈1 小时前
java学习--Collection的迭代器
java·python·学习
NAGNIP8 小时前
一文搞懂机器学习中的特征降维!
算法·面试
NAGNIP8 小时前
一文搞懂机器学习中的特征构造!
算法·面试
梨落秋霜8 小时前
Python入门篇【文件处理】
android·java·python
Java 码农8 小时前
RabbitMQ集群部署方案及配置指南03
java·python·rabbitmq
Learn Beyond Limits8 小时前
解构语义:从词向量到神经分类|Decoding Semantics: Word Vectors and Neural Classification
人工智能·算法·机器学习·ai·分类·数据挖掘·nlp
你怎么知道我是队长9 小时前
C语言---typedef
c语言·c++·算法
张登杰踩10 小时前
VIA标注格式转Labelme标注格式
python
Qhumaing10 小时前
C++学习:【PTA】数据结构 7-1 实验7-1(最小生成树-Prim算法)
c++·学习·算法