博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】307. Range Sum Query - Mutable
阅读量:6828 次
发布时间:2019-06-26

本文共 2086 字,大约阅读时间需要 6 分钟。

题目如下:

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

代码如下:

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)

 

转载于:https://www.cnblogs.com/seyjs/p/9212973.html

你可能感兴趣的文章
免费小说阅读小程序
查看>>
Spring MVC打印@RequestBody、@Response日志
查看>>
windows系统安装配置react-native运行环境
查看>>
Ajax在vue中的封装及使用
查看>>
python 使用PyQt5
查看>>
在Antd-Pro下实现文件下载
查看>>
Kotlin整合Vertx开发Web应用
查看>>
css-float
查看>>
95%的技术面试必考的JVM知识点都在这,另附加分思路!
查看>>
行为型模式:策略模式
查看>>
玩转Elasticsearch源码-ActionModule启动分析
查看>>
诚意之作,SuperTextView (v3.1.1)
查看>>
【重温基础】18.相等性判断
查看>>
一篇文章入门SQL语句
查看>>
【跃迁之路】【709天】程序员高效学习方法论探索系列(实验阶段466-2019.1.30)...
查看>>
Spring5:@Autowired注解、@Resource注解和@Service注解
查看>>
vue系列之双向绑定&vDom总结
查看>>
引用变量
查看>>
学习笔记PHP02、PHP的下载与安装
查看>>
vue项目中获取外部js,并使用其中方法
查看>>