假设我们有一个整数数组。我们必须找到从索引i到j的元素之和。我们必须记住两件事,数组将是不可变的,因此元素不会被更改,并且会有多个此类查询。因此,我们必须考虑大量查询的执行时间。假设数组类似于A = [5,8,3,6,1,2,5],那么如果查询为(A,0,3),则它将为5 + 8 + 3 + 6 = 22。
为了解决这个问题,我们将遵循以下步骤-
取一个数组B。B [i]将存储从0到i的元素之和
对于查询,请执行B [j] – B [i – 1]
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class NumArray { public: vector <int> pre; NumArray(vector<int>& nums) { pre.clear(); int n = nums.size(); pre.resize(n); for(int i = 0; i < n; i++){ if(i == 0)pre[0] = nums[0]; else pre[i] = pre[i - 1] + nums[i]; } } int sumRange(int i, int j) { if(i == 0)return pre[j]; return pre[j] - pre[i - 1]; } }; main(){ vector<int> v = {5,8,3,6,1,2,5}; NumArray na(v); cout<<na.sumRange(0,2)<<endl; cout<<na.sumRange(2,5)<<endl; cout<<na.sumRange(0,5)<<endl; }
Initialize it with [5,8,3,6,1,2,5] Call sumRange(0,2) sumRange(2,5) sumRange(0,5)
输出结果
16 12 25