题目如下:

解题思路:就三个字-线段树。这个题目是线段树用法最经典的场景。

代码如下:

class NumArray(object):

    def __init__(self, nums):
"""
:type nums: List[int]
"""
self.nl = nums
self.tree = []
if len(nums) == 0:
return
for i in xrange((4*len(nums)+1)):
self.tree.append([])
self.build(1,len(nums),1,nums)
#print self.tree def build(self,l,r,k,nums):
self.tree[k] = [l,r]
if l == r: #leaf
self.tree[k].append(nums[l-1])
return nums[l-1]
wl = self.build(l,(l+r)/2,2*k,nums)
wr = self.build((l+r)/2+1,r,2*k+1,nums)
#print l,r,wl,wr
self.tree[k].append(wl+wr)
return self.tree[k][2] def update(self, i, val):
"""
:type i: int
:type val: int
:rtype: void
"""
if i > len(self.nl):
return
diff = self.nl[i] - val
#for j in range(i,len(self.sl)):
# self.sl[j] -= diff
self.nl[i] = val
k = 1
i += 1
while True:
self.tree[k][2] -= diff
m = (self.tree[k][0] + self.tree[k][1])/2
if self.tree[k][0] == self.tree[k][1]:
break
if i <= m:
k = 2*k
else:
k = 2*k + 1 #print self.tree def calcRange(self,i,j,k):
#print i,j,k
if i == self.tree[k][0] and j == self.tree[k][1]:
return self.tree[k][2]
m = (self.tree[k][0] + self.tree[k][1])/2
if j <= m:
return self.calcRange(i,j,2*k)
elif i > m:
return self.calcRange(i,j,2*k+1)
else:
return self.calcRange(i,m,2*k) + self.calcRange(m+1,j,2*k+1) def sumRange(self, i, j):
"""
:type i: int
:type j: int
:rtype: int
"""
#print self.sl
#print self.nl
return self.calcRange(i+1,j+1,1) # Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# obj.update(i,val)
# param_2 = obj.sumRange(i,j)

最新文章

  1. Mysql常用表操作 | 单表查询
  2. 找出数组中从未出现的最小正整数java实现
  3. Windows Azure初体验
  4. Android应用内语言切换实现(转)
  5. 十六、Swing高级组件
  6. 单例模式C#
  7. window.history
  8. 详述iOS国际化
  9. 二、Solr安装(Tomcat)
  10. HDU 5768 - Lucky7
  11. 【Loadrunner】初学Loadrunner——参数化设置(Table类型关联数据库)
  12. Xcode 10.1 运行老版本工程遇到问题解决记录
  13. Go基础系列:Go中的方法
  14. Python数据类型之字符串
  15. MyEclipse下创建的项目 导入eclipse
  16. php路径常量
  17. TZOJ 数据结构期末历年题目
  18. 日志审计系统、事件日志审计、syslog审计
  19. Python Flask高级编程
  20. Just Another Problem UVA - 11490(枚举)

热门文章

  1. EXCEL生成随机密码函数
  2. Rtmp AAC基本格式(转)
  3. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_2_字符串的构造方法和直接创建
  4. JsonDatetime
  5. C#之委托(二)
  6. 时间同步,使用oracle自带的ctss
  7. 编码总结一:Java默认字符集
  8. docker--docker版本以及安装
  9. Windows + Ubuntu 16.04 双系统安装详细教程(转)
  10. HDFS数据流——读数据流程