Given an integer array in the construct method, implement two methods query(start, end) and modify(index, value):

For query(start, end), return the sum from index start to index end in the given array.
For modify(index, value), modify the number in the given index to value
Have you met this question in a real interview? Yes
Example
Given array A = [1,2,7,8,5]. query(0, 2), return 10.
modify(0, 4), change A[0] from 1 to 4.
query(0, 1), return 6.
modify(2, 1), change A[2] from 7 to 1.
query(2, 4), return 14.
Note
We suggest you finish problem Segment Tree Build, Segment Tree Query and Segment Tree Modify first. Challenge
O(logN) time for query and modify.

Segment Tree:

 public class Solution {
/* you may need to use some attributes here */
class SegmentTreeNode {
long sum;
int start;
int end;
SegmentTreeNode left;
SegmentTreeNode right;
SegmentTreeNode(int start, int end) {
this.sum = 0;
this.start = start;
this.end = end;
this.left = null;
this.right = null;
}
} SegmentTreeNode root; /**
* @param A: An integer array
*/
public Solution(int[] A) {
// write your code here
if (A == null || A.length==0) return;
root = build(A, 0, A.length-1); } public SegmentTreeNode build(int[] A, int start, int end) {
SegmentTreeNode cur = new SegmentTreeNode(start, end);
if (start == end) cur.sum = A[start];
else {
int mid = (start + end)/2;
cur.left = build(A, start, mid);
cur.right = build(A, mid+1, end);
cur.sum = cur.left.sum + cur.right.sum;
}
return cur;
} /**
* @param start, end: Indices
* @return: The sum from start to end
*/
public long query(int start, int end) {
// write your code here
return queryTree(root, start, end);
} public long queryTree(SegmentTreeNode cur, int start, int end) {
if (cur.start==start && cur.end==end) return cur.sum;
int mid = (cur.start + cur.end)/2;
if (end <= mid) return queryTree(cur.left, start, end);
else if (start > mid) return queryTree(cur.right, start, end);
else return queryTree(cur.left, start, mid) + queryTree(cur.right, mid+1, end);
} /**
* @param index, value: modify A[index] to value.
*/
public void modify(int index, int value) {
// write your code here
modifyTree(root, index, value);
} public void modifyTree(SegmentTreeNode cur, int index, int val) {
if (cur.start == cur.end) {
cur.sum = val;
return;
}
int mid = (cur.start + cur.end)/2;
if (index <= mid) modifyTree(cur.left, index, val);
else modifyTree(cur.right, index, val);
cur.sum = cur.left.sum + cur.right.sum;
}
}

最新文章

  1. thinkcmf 常用操作
  2. 项目:学生查看自己的作业情况和分数(php)
  3. 缺省servlet的使用
  4. MVVM架构~knockoutjs与MVC配合,实现列表的增删改功能
  5. CSS3线性渐变和径向渐变
  6. jquery中append跟prepend的用法
  7. Ubuntu安装Burg
  8. /proc/sys/net/ipv4/下各项的意义
  9. JavaSE生成随机数
  10. xml增强学习笔记
  11. Eclipse正确导入第三方project
  12. Uncaught TypeError: download is not a function at HTMLAnchorElement.onclick (index.html:25)
  13. sql server 查询时会锁表吗?
  14. WINDOWS 2008Server 配置nginx 反向代理服务器 安装成服务
  15. cocos2dx添加新的类后出现错误undefined reference to的解决办法
  16. ext.js的mvc开发模式详解
  17. cocos2d-x 3.0 正式版 项目创建
  18. Redis安装与测试
  19. python OS 模块 文件目录操作
  20. Getting command line access to PHP and MySQL running MAMP on OSX

热门文章

  1. Computer architecture Computer organization
  2. json 数组转换为js数组
  3. PowerDesigner连接MySQL,建立逆向工程图解
  4. Oracle存储过程基本语法 存储过程
  5. jboss中文支持
  6. java开发bug 在启动Tomcat 6.0时发现第一条信息便是
  7. EFI
  8. docker squid---but git proxy should specify by git config --global http.proxy http:...
  9. 【Java 基础篇】【第八课】package包
  10. 【Android开发学习笔记】【第四课】基础控件的学习