当前位置: 首页 > news >正文

线段树入门:算法分析

算法分析

线段树采用了分而治之的策略,其点更新、区间更新、区间查询都可以在 时间内完成。树状数组和线段树都用于解决频繁修改和查询的问题,树状数组比线段树更节省空间、代码简单易懂,但是先单数用途更广、更加灵活,凡是可以使用树状数组的问题都可以用线段树来解决。

例题讲解

线段树的题目并不是一成不变的,对于不同的题目,你可能需要修改线段树的模板,来实现各种功能。

区域和检索-数组可修改

给你一个数组nums,请你完成两类查询。

  1. 其中一类查询要求更新数组nums下标对应的值
  2. 另一类查询要求返回数组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]

示例 1:

输入:["NumArray", "sumRange", "update", "sumRange"][[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]输出:[null, 9, null, 8]

解释

NumArray numArray = new NumArray([1, 3, 5]);

numArray.sumRange(0, 2); // 返回 1 + 3 + 5 = 9

numArray.update(1, 2); // nums = [1,2,5]

numArray.sumRange(0, 2); // 返回 1 + 2 + 5 = 8

解题思路

本题是经典的线段树模板题,只需要根据之前的线段树模板稍作修改即可 (将区间最值查询改为区间求和)。

参考代码

class NumArray { public: struct sgntree{ int l,r,val; }T[120010]; vector<int>num; void build(int p,int l,int r){ T[p].l=l,T[p].r=r; if(l==r){ T[p].val=num[l-1]; return; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); T[p].val=T[p<<1].val+T[p<<1|1].val; } NumArray(vector<int>& nums) { num=nums; int n=nums.size(); build(1,1,n); } void Update(int p,int l,int val){ if(T[p].l==T[p].r&&T[p].l==l){ T[p].val=val; return; } int mid=(T[p].l+T[p].r)>>1; if(l<=mid) Update(p<<1,l,val); else Update(p<<1|1,l,val); T[p].val=T[p<<1].val+T[p<<1|1].val; } void update(int index, int val) { Update(1,index+1,val); } int query(int p,int l,int r){ if(T[p].l>=l&&T[p].r<=r){ return T[p].val; } int mid=(T[p].l+T[p].r)>>1; if(r<=mid) return query(p<<1,l,r); if(l>mid) return query(p<<1|1,l,r); return query(p<<1,l,mid)+query(p<<1|1,mid+1,r); } int sumRange(int left, int right) { return query(1,left+1,right+1); } }; /** * Your NumArray object will be instantiated and called as such: * NumArray* obj = new NumArray(nums); * obj->update(index,val); * int param_2 = obj->sumRange(left,right); */
http://www.jsqmd.com/news/879854/

相关文章:

  • Legacy iOS Kit:终极指南:让旧款iPhone/iPad重获新生
  • 《普通人打造AI小团队:通用智能体与企业级智能体搭建》第1、2、3章
  • GetQzonehistory:如何永久保存你的QQ空间记忆
  • 《普通人打造AI小团队:通用智能体与企业级智能体搭建》第4、5、6章
  • 如何发起微信投票活动,三分钟教会 - 资讯纵览
  • 河北三纸一膜瓷砖胶袋供应商大搜罗,2026年05月优选,阀口袋/面粉袋/软托盘/牛皮纸袋,三纸一膜瓷砖胶袋经营部推荐 - 品牌推荐师
  • 创业团队如何借助Taotoken统一API快速上线AI产品功能
  • 20260524
  • 2026年5月诚信的气动元器件/气动附件厂家推荐钢特阀门科技有限公司,恪守经营本心打造靠谱气动配套产品 - 品牌鉴赏师
  • 独立开发者如何借助Taotoken的Token Plan套餐有效控制AI实验成本
  • 《普通人打造AI小团队:通用智能体与企业级智能体搭建》第7、8章
  • 2026年广州除四害公司推荐榜:这三家专业又靠谱 - 资讯纵览
  • 2026广州除四害公司推荐榜:服务口碑排名谁更强 - 资讯纵览
  • 宁波靠谱手机维修店铺大揭秘,你知道几家? - 资讯纵览
  • 江阴沙发翻新换皮换布面靠谱商家优选推荐|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌、全品类沙发翻新换皮换布一站式服务 - 卓信营销
  • 第三次软工团队作业
  • 宜兴沙发翻新换皮换布面靠谱商家优选推荐|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌、全品类沙发翻新换皮换布一站式服务 - 卓信营销
  • Kubernetes性能优化指南:提升集群运行效率
  • 2026 年成都螺纹钢厂家及采购优选推荐 四川盛世钢联钢厂联营资源等你来抢 - 四川盛世钢联营销中心
  • 如何利用专业级游戏资源逆向工具深度解析FromSoftware游戏文件格式
  • 瑞安沙发翻新换皮换布面靠谱商家优选推荐|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌、全品类沙发翻新换皮换布一站式服务 - 卓信营销
  • 2026年4月目前靠谱的大件物流公司推荐,大件物流/大件货运/大件运输,大件物流公司有哪些 - 品牌推荐师
  • alpha冲刺作业
  • 昆明卖黄金避坑攻略,恒顺黄金无损检测大额交易更安心 - 资讯纵览
  • 企业内网应用通过Taotoken实现安全可控的大模型能力调用
  • 3分钟快速上手:通达信缠论可视化插件终极使用指南
  • 2026广州除四害公司靠谱排行榜:TOP5推荐清单 - 资讯纵览
  • [t.9.8] Scrum Meeting 8
  • C# MQTT性能优化:工业级高可靠低带宽实战指南
  • 红河旧金变现哪家强?恒顺黄金 22 年老店透明不套路 - 资讯纵览