LINTCODE——区间求和II
来源:互联网 发布:手机c语言编程软件6.0 编辑:程序博客网 时间:2024/06/15 21:10
LINTCODE——区间求和II
思路:线段树的构造,线段树的查询,线段树的修改的结合版,三个程序拼接再一起就是这个题目的解法了,和统计前面比自己小的数的个数一样
class Solution {class SegmentTreeNode{ public: int start, end; long long count; SegmentTreeNode *left, *right; SegmentTreeNode(int start, int end, int count) { this->start = start; this->end = end; this->count = count; this->left = this->right = NULL; } };private: SegmentTreeNode *root;public: /* you may need to use some attributes here */ /* * @param A: An integer array */ Solution(vector<int> A) { // do intialization if necessary root = build(0,A.size()-1); for(int i = 0; i<A.size(); i++) { modify(i, A[i]); } } /* * @param start: An integer * @param end: An integer * @return: The sum from start to end */ long long query(int start, int end) { // write your code here return query(root, start, end); } long long query(SegmentTreeNode *root, int start, int end) { if(root == NULL || start > end) return 0; if(start <= root -> start && end >= root -> end) return root -> count; int mid = (root -> start + root -> end)/2; if(start > mid) return query(root -> right , start, end); else if(end < mid +1) return query(root -> left ,start ,end); else return( query(root->left, start ,mid) + query(root -> right , mid +1,end) ); } /* * @param index: An integer * @param value: An integer * @return: nothing */ void modify(int index, int value) { // write your code here modify(root, index, value); } void modify(SegmentTreeNode *root, int index, int value) { if(root == NULL || index < root -> start || index > root -> end) return; if(root->start == index && root -> end == index) { root -> count = value; return; } else { int mid = (root -> start + root -> end)/2; if(index > mid ) modify(root->right, index, value); else modify(root->left, index, value); } //root的值等于左节点加右节点 root -> count = root->left->count + root->right->count; return; } SegmentTreeNode *build(int start, int end) { // write your code here if(start > end) return NULL; SegmentTreeNode *root = new SegmentTreeNode(start,end,0); if(start == end) { root->left = root -> right = NULL; return root; } root->left = build(root->start,(root->start+root->end)/2); root->right= build((root->start+root->end)/2+1 , root -> end); return root; }};
阅读全文
1 0
- LINTCODE——区间求和II
- LintCode:区间求和 II
- 区间求和 II -LintCode
- lintcode(207)区间求和 II
- [Lintcode]Interval Sum II区间求和 II
- LintCode:区间求和
- 区间求和 I -LintCode
- lintcode--区间求和 I
- 区间求和II
- lintcode-区间求和I-206
- FZU 2171 —— 防守阵地 II(线段树,区间求和+区间更新)
- 链表求和 II-LintCode
- 搜索区间——LintCode
- LintCode——搜索区间
- Lintcode——合并区间
- lintCode(408)——二进制求和
- lintcode(221)链表求和 II
- LintCode-[中等] 221. 链表求和 II
- Mapreduce运行67%异常解决
- 多线程之Phaser
- Hbase数据存储结构
- MyEclipse 常用快捷键
- Centos 7 开放查看端口 防火墙关闭打开
- LINTCODE——区间求和II
- GD库的学习
- 导航栏返回的上一级的颜色变化如何处理
- 多线程面试题
- 3.第一个Java程序HelloWorld
- Mongodb 利用mongoshell进行数据类型转换
- Maven聚合与继承
- 文件下载
- 关键路径的相关知识