给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数[start, end]
。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的总和,并返回在结果列表中。
样例
对于数组 [1,2,7,8,5]
,查询[(1,2),(0,4),(2,4)]
, 返回 [9,23,20]
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/
class Solution {
public:
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/
vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<long long> result;
int m = A.size();
int n = queries.size();
if (m < 1 || n < 1)
{
return result;
}
long long node[m*4+10];
build(node, A, 1, 0, m-1);
for (int i = 0; i < n; i++)
{
result.push_back(query(node, 1, 0, m-1, queries[i].start, queries[i].end));
}
return result;
}
private:
void build(long long *node, vector<int> &A, int pos, int begin, int end)
{
if (begin == end)
{
node[pos] = A[begin];
}
else
{
build(node, A, 2*pos, begin, (begin+end)/2);
build(node, A, 2*pos+1, (begin+end)/2+1, end);
node[pos] = node[2*pos] + node[2*pos+1];
}
}
long long query(long long *node, int pos, int begin, int end, int left, int right)
{
long long p1, p2;
if (left > end || right < begin)
{
return 0;
}
if (begin >= left && end <= right)
{
return node[pos];
}
p1 = query(node, 2*pos, begin, (begin+end)/2, left, right);
p2 = query(node, 2*pos+1, (begin+end)/2+1, end, left, right);
return p1+p2;
}
};