范围总和查询-C ++中的不可变

假设我们有一个整数数组。我们必须找到从索引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