题解 | #【模板】前缀和#

【模板】前缀和

https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf

解法一:暴力解法

根据题意,直接进行模拟,每次询问从 l 到 r 进行遍历求和。时间复杂度:O(n * q),会超时

解法二:前缀和

两步走:

第一步:预处理一个前缀和数组

用dp[i]表示从0位置到i位置的元素的和,则遍历数组一次,可以得到一个前缀和数组,前缀和数组中保存了dp[i]的每个数据。

在输入nums和预处理前缀和数组时,要注意边界情况,给nums和dp数组多开一个空间。

第二步:使用前缀和数组

有了前缀和数组之后,就可以以O(1)时间拿到 l 到 r 的元素和:

C++代码

#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

int main()
{
    int n = 0, q = 0;
    cin >> n >> q;
    vector<int> nums(n + 1);
    for(int i = 1; i < n + 1; ++i) {
        cin >> nums[i];
    }
    vector<ll> dp(n + 1);
    for(int i = 1; i < n + 1; ++i) {
        dp[i] = dp[i - 1] + nums[i];
    }
    int l = 0, r = 0;
    while(q--)
    {
        cin >> l >> r;
        cout << dp[r] - dp[l - 1] << endl;
    }
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务