您的位置:首页 > 其它

区间求和 I -LintCode

2017-09-13 15:15 218 查看
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end] 。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的总和,并返回在结果列表中。

注意事项:

在做此题前,建议先完成以下三题:线段树的构造, 线段树的查询,以及线段树的修改。

样例:

对于数组 [1,2,7,8,5],查询[(1,2),(0,4),(2,4)], 返回 [9,23,20]

挑战 :

O(logN) time for each query

#ifndef C206_H
#define C206_H
#include<iostream>
#include<vector>
using namespace std;
class Interval{
public:
int start, end;
Interval(int start, int end)
{
this->start = start;
this->end = end;
}
};
class SegmentNode{
public:
int start, end;
long long sum;
SegmentNode *left, *right;
SegmentNode(int start, int end, long long sum)
{
this->start = start, this->end = end, this->sum = sum;
this->left = this->right = NULL;
}
};
class Solution {
public:
/*
* @param A: An integer list
* @param queries: An query list
* @return: The result list
*/
vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<long long> v;
if (A.empty() || queries.empty())
return v;
SegmentNode *root = build(A, 0, A.size()-1);
for (auto c : queries)
{
v.push_back(query(root, c.start, c.end));
}
return v;
}
SegmentNode * build(vector<int> &A, int start, int end)
{
if (start > end)
return NULL;
SegmentNode *node = new SegmentNode(start, end, 0);
if (start == end)
{
node->sum = A[start];
return node;
}
node->left = build(A, start, (start + end)/2);
node->right = build(A, (start + end)/2 + 1, end);
node->sum = node->left->sum + node->right->sum;
return node;
}
long long query(SegmentNode *root, int start, int end)
{
if (root == NULL)
return 0;
if (start > root->end || end < root->start || start > end)
return 0;
if (start == root->start && end == root->end)
return root->sum;
if (end <= root->left->end)
return query(root->left, start, end);
else if (start >= root->right->start)
return query(root->right, start, end);
else
return query(root->left, start, root->left->end) + query(root->right, root->right->start, end);
}
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: