LeetCode—307. 区域和检索 - 数组可修改

307. 区域和检索 - 数组可修改

题目描述:
给你一个数组 nums ,请你完成两类查询。

其中一类查询要求 更新 数组 nums 下标对应的值
另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right
实现 NumArray 类:

NumArray(int[] nums) 用整数数组 nums 初始化对象
void update(int index, int val) 将 nums[index] 的值 更新 为 val
int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 (即,nums[left] + nums[left + 1], …, nums[right])
在这里插入图片描述

考察重点:可以直接以数组记录每个索引点的数组和,也可以使用线段树的数组形式进行存储。二者运行时间分别为:
在这里插入图片描述
数组索引

type NumArray struct {nums []intsum []int
}func Constructor(nums []int) NumArray {sum := make([]int, len(nums))sum[0] = nums[0]for i := 1;i < len(nums);i ++{sum[i] = sum[i-1] + nums[i] }return NumArray{nums: nums, sum: sum}
}func (this *NumArray) Update(index int, val int)  {temp := this.nums[index] - valfor i := index;i < len(this.nums);i ++{this.sum[i] -= temp}this.nums[index] = val
}func (this *NumArray) SumRange(left int, right int) int {if left == 0{return this.sum[right]}return this.sum[right] - this.sum[left-1]
}

线段树

type NumArray1 struct {trees []intnLen  int
}/**偶数个:1,2,3,4103		71 2     3 4奇数个:1,2,361   52 3可以发现叶节点比内部节点多1,所以n-(2n-1)存放叶节点,1-(n-1)存放内部节点
*/
func Constructor11(nums []int) NumArray1 {nLen := len(nums)trees := make([]int, 2*nLen)           //构建2*n的空间来存放线段树for i, j := nLen, 0; i < 2*nLen; i++ { //n 到 2n-1用来存放原数组(叶节点)trees[i] = nums[j]j++}for i := nLen - 1; i > 0; i-- { // n-1 到 0 用来存放左右节点和trees[i] = trees[2*i] + trees[2*i+1]}return NumArray1{trees: trees, nLen: nLen}
}func (tt *NumArray1) Update(index int, val int) {index = index + tt.nLen //index存放在index + n位置上tt.trees[index] = valfor index > 0 { //依次更新所有父节点的值right, left := index, indexif index%2 == 0 { //为零说明index在左子树,right++,否则left--;left和right分别在index/2的左右两边right = index + 1} else {left = index - 1}tt.trees[index/2] = tt.trees[right] + tt.trees[left]index /= 2}
}func (tt *NumArray1) SumRange(left int, right int) int {// get leaf with value 'l'left += tt.nLen// get leaf with value 'r'right += tt.nLensum := 0for left <= right {if (left % 2) == 1 { //如果left是右子树,则只加当前left,不再由这个left向其父节点延伸sum += tt.trees[left]left++}if (right % 2) == 0 { //如果right是左子树,则只加当前right,不再由这个right向其父节点延伸sum += tt.trees[right]right--}left /= 2right /= 2}return sum
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

loadrunner利用虚拟IP测试

LoadRunner 使用虚拟IP测试流程 设置虚拟IP地址 首先&#xff0c;load Generator机器必须使用固定的IP&#xff0c;不能使用动态IP 确定网络中不冲突的IP地址 打开&#xff1a;开始-〉程序-〉loadrunner-〉tools-〉ip wizard&#xff0c; 说明&#xff1a;增加新IP选择第一项&a…

33Exchange Server 2010跨站点部署-分支机构邮件从分支机构出

16.6 SH-ROBIN外网邮件从分部出16.6.1 创建SH-ROBIN发送连接器在上海分支机构的集线器上创建一个发送连接器SH-To Internet添加地址空间&#xff0c;并设定成本添加上海分支机构的两台HT创建好上海分支机构的发送连接器16.6.2 SH-ROBIN站的TOM发送邮件给公网CONTOSOCONTOSO的张…

74HC595芯片使用说明

74HC595是具有8位移位寄存器和一个存储器&#xff0c;三态输出功能。 移位寄存器和存储器是分别的时钟。数据在SHcp的上升沿输入&#xff0c;在STcp的上升沿进入的存储寄存器中去。如果两个时钟连在一起&#xff0c;则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串…

我的设计模式之旅(4)——生成器(建造者)模式Builder

Builder模式也是创建型模式中的一种。主要用来应对构成复杂但构成结构和顺序相对稳定的对象的创建工作。目的是省去在对象发生变化时&#xff0c;需要修改代码中每一处对象创建的地方&#xff0c;应用这种模式&#xff0c;可以在一个复杂对象的内部结构(由许多其他子对象构成的…

LeetCode—309. 最佳买卖股票时机含冷冻期

309. 最佳买卖股票时机含冷冻期 题目描述&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff…

display:inline-block的深入理解 转

在使用CSS实现表现的时候&#xff0c;会经常接触到display:inline-block这一属性&#xff0c;无论是初接触Web标准还是接触标准已久的朋友&#xff0c;大都会对这一属性感觉很迷惑和模糊。 display:inline-block 引用:将对象呈递为内联对象&#xff0c;但是对象的内容作为块对象…

innosetup区分正常状态和静默安装状态(通过传递的参数)

命令行运行程序&#xff0c;如&#xff1a; myprogram.exe /abc /bcd 如果我们想获取其中的参数&#xff0c;“/abc”、“/bcd” 1. 直接使用innosetup自带的方法&#xff0c; GetCmdTail() 将所有参数作为一个字符串返回&#xff0c;安装和卸载都适用 注意&#xff1a;如果打…

测试计划排期内容和格式要求,测试邮件回复统一格式

公司最近在做一些测试流程规范&#xff0c;每次项目立项后&#xff0c;需要确认本次项目测试负责人&#xff0c;由测试项目负责人参加完需求评审后&#xff0c;协调资源 给出测试计划排期与对应子模块负责人员到项目经理处。 下面提供给大家一个测试计划排期内容和格式文档 2.测…

LeetCode—剑指 Offer 4、9、26、35、53

剑指 Offer 4. 二维数组中的查找、9. 用两个栈实现队列、26. 树的子结构、35. 复杂链表的复制、53 - I. 在排序数组中查找数字 I 题目描述&#xff1a; [4] 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺…

关于VerifyError

http://slurp.doc.ic.ac.uk/pubs/observing/linking.htmlhttp://blog.csdn.net/smilingleo?viewmodelist转载于:https://www.cnblogs.com/diyunpeng/archive/2011/08/30/2159108.html

Ubuntu 安装 JDK 问题

2019独角兽企业重金招聘Python工程师标准>>> 1. 下载并解压缩 2. mv到/usr/lib/jdk 3. 在~/.bashrc文件末尾添加环境变量 export JAVA_HOME/usr/lib/jdkexport CLASSPATH${JAVA_HOME}/libexport PATH${JAVA_HOME}/bin:$PATH 4. 重启终端&#xff0c;输入javac -vers…

Asp.net中水晶报表的使用

在我们对VS.Net中的水晶报表&#xff08;Crystal Reports&#xff09;进行研究之前&#xff0c;我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心。一周以后&#xff0c;在阅读了大量的“HOWTO”文档之后&#xff0c;我们成功地将一些简单的报告加入到了我们…

Html颜色值 to RGB

//Html颜色值转换为RGBfunction HhtmlColorToRGB(color){var str"0x" color.substring(1,color.length);var rstr&0x0000FF;var g(str&0x00FF00)>>8;var b(str&0xFF0000)>>16;return b "," g "," r;}转载于:https:…

LeetCode—剑指 Offer 32 - I、II、III. 从上到下打印二叉树

剑指 Offer 32. 从上到下打印二叉树 题目描述&#xff1a; 使用层序遍历&#xff0c;遍历二叉树的三种题目。 [I] 从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 [II] 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印…

2011-8-31 身体欠佳

1. 前几日明显感到身体欠佳&#xff0c;熬夜很难受&#xff0c;以往搞到1点问题不大的&#xff0c; 老了啊。 经过几天作息时间的调整&#xff0c;回家不开电脑&#xff0c;23点之前上床&#xff0c;在加上食疗&#xff0c;今天缓过来了。 看来有必要把生活节奏放慢一点&#x…

java方法的定义格式

Java的方法类似于其他语言的函数&#xff0c;是一段用来完成特定功能的代码片段&#xff0c;声明格式为: [修饰符1 修饰符2 …..] 返回值类型 方法名( 形式参数列表 ){ Java 语句;… … … } 例如 public static int add(int a,int b){ int sumab; return sum; } 语法解释&a…

Scala学习(一)--Scala基础学习

Scala基础学习 摘要&#xff1a; 在篇主要内容&#xff1a;如何把Scala当做工业级的便携计算器使用&#xff0c;如何用Scala处理数字以及其他算术操作。在这个过程中&#xff0c;我们将介绍一系列重要的Scala概念和惯用法。同时你还将学到作为初学者如何浏览Scaladoc文档 1. 使…

Test live writer

拷贝屏幕来的图片 转载于:https://www.cnblogs.com/huobazi/archive/2006/11/19/565070.html

LeetCode—剑指 Offer 10 - I、II 斐波那契数列、青蛙跳台阶问题 63. 股票的最大利润

剑指 Offer 10 - I、II 斐波那契数列、青蛙跳台阶问题 63. 股票的最大利润 题目描述&#xff1a; [I] 斐波那契数列由 0 和 1 开始&#xff0c;之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为…

开始我的AI之旅

sina的博客总给我感觉周围都是娱乐新闻&#xff0c;乱七八糟的花边&#xff0c;混乱至极的排版&#xff0c;简直就是密集亲密症的家园。文章都叫博文啥的&#xff0c;好像很博学一样&#xff0c;压力好大。 回到博客园&#xff0c;发现界面还是如此简洁清晰&#xff0c;可惜当年…