区间求和 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
注意事项:
在做此题前,建议先完成以下三题:线段树的构造, 线段树的查询,以及线段树的修改。
样例:
对于数组 [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
相关文章推荐
- [Lintcode]Interval Sum II区间求和 II
- lintcode--区间求和 I
- 区间求和 II -LintCode
- lintcode(207)区间求和 II
- lintcode-区间求和I-206
- lintcode-206-区间求和 I
- HDU 4614 花瓶与花 数据结构+求和+区间赋值+维护空位
- 一维二维树状数组区间加与区间求和
- 算法模板——线段树1(区间加法+区间求和)
- NYOJ 116 士兵杀敌(二)(线段树—区间求和,单点加值更新)
- WHU 1464(线段树减,除,区间求和)
- POJ3468(线段树区间增加,区间求和)
- Splay解决区间问题[区间更新,区间求和]
- 链表求和(LintCode)
- 线段树 区间求和模板 (区间修改)
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- HDU 1698 just a hook 线段树,区间定值,求和
- zzulioj--1827--石锅全拌(区间求和水题)
- 线段树系列-hdu-1166-敌兵布阵-单点修改区间求和
- HDU 1698 Just a Hook 线段树区间更新求和