307.区域和检索

news/2024/10/18 18:20:55/

题目来源:

        leetcode题目,网址:307. 区域和检索 - 数组可修改 - 力扣(LeetCode)

解题思路:

       线段树,以二叉树的形式存储部分区间之和及总和。

解题代码:

class NumArray {
private:vector<int> segment;int n;void buildSegment(int pos,int start,int end,vector<int>& nums){if(start==end){segment[pos]=nums[start];return ;}int mid=start+(end-start)/2;    //一般元素buildSegment(pos*2+1,start,mid,nums);       //前半段的和buildSegment(pos*2+2,mid+1,end,nums);       //后半段的和segment[pos]=segment[pos*2+1]+segment[pos*2+2];return ;}void change(int posNow,int startPos,int endPos,int targetPos,int targetVal){if(startPos==endPos){segment[posNow]=targetVal;return ;}int mid=startPos+(endPos-startPos)/2;if(targetPos<=mid){change(2*posNow+1,startPos,mid,targetPos,targetVal);}else{change(2*posNow+2,mid+1,endPos,targetPos,targetVal);}segment[posNow]=segment[2*posNow+1]+segment[2*posNow+2];}int getSum(int posNow,int startPos,int endPos,int left,int right){if(left==startPos && right==endPos){return segment[posNow];}int mid=startPos+(endPos-startPos)/2;if(right<=mid){return getSum(posNow*2+1,startPos,mid,left,right);}else if(left>mid){return getSum(posNow*2+2,mid+1,endPos,left,right);}else{return getSum(posNow*2+1,startPos,mid,left,mid)+getSum(posNow*2+2,mid+1,endPos,mid+1,right);}}
public:NumArray(vector<int>& nums) {n=nums.size();vector<int> newSeg(4*nums.size());  //元素个数不会超过2*nums.size()-1segment=newSeg;buildSegment(0,0,nums.size()-1,nums);/*     for(int i=0;i<segment.size();i++){cout<<segment[i]<<" ";}cout<<endl;*/}void update(int index, int val) {change(0,0,n-1,index,val);/*     cout<<"update "<<index<<" "<<val<<endl;for(int i=0;i<segment.size();i++){cout<<segment[i]<<" ";}cout<<"end"<<endl;*/}int sumRange(int left, int right) {return getSum(0,0,n-1,left,right);}
};/*** 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.ppmy.cn/news/1215678.html

相关文章

微机原理_7

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1,与十进制数1770.625对应的八进制数是()。 A. 3352.5 B. 3350.5 C. 3352.1161 D. 3350.1151 2.8 位有符号数二进制补码表示的整数的范围是&#xff08;&#xff09; A. -…

如何评估一个需求?需求做不完,怎么办?

如何评估一个需求&#xff1f; 需求的背景是什么&#xff1f;为什么要做这个需求&#xff1f;这个需求有什么价值&#xff1f;这个需求对比人力的性价比怎么样&#xff1f;提前看需求文档&#xff0c;不懂得及时向产品提问哪些功能是新增的&#xff0c;哪些功能是修改的需求的…

『亚马逊云科技产品测评』活动征文|Amazon EC2 的讲解及相关服务

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 Amazon EC2 的讲解及相关服务 一、什么是 Amazon EC2&#xff1f;二、何为…

vue v-model

一、为什么使用v-model&#xff1f; v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。本质上是语法糖&#xff0c;负责监听用户的输入事件来更新数据。 二、什么场景下会使用v-model&#xff1f; ①…

CC1310F128RSMR Sub-1GHz超低功耗无线微控制器芯片

CC1310F128RSMR QFN-32 Sub-1GHz超低功耗无线微控制器 CC1310F128RSMR是一款低成本、 超低功耗、Sub-1 GHz射频器件&#xff0c;它是Simplel ink微控制器(MCU)平台的一部分。该平台由Wi- Fi组成、蓝牙低功耗&#xff0c;Sub-1 GHz&#xff0c;以太网&#xff0c;Zigbee线程和主…

【done】剑指offer46_new:解密数字

题目&#xff1a;力扣165&#xff0c;https://leetcode.cn/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/description/ 现有一串神秘的密文 ciphertext&#xff0c;经调查&#xff0c;密文的特点和规则如下&#xff1a; 密文由非负整数组成 数字 0-25 分别对应字母 a-z 请…

东莞松山湖数据中心|莞服务器托管的优势

东莞位于珠江三角洲经济圈&#xff0c;交通便利&#xff0c;与广州、深圳等大城市相邻&#xff0c;而且东莞是中国重要的制造业基地&#xff0c;有众多的制造业和科技企业集聚于此&#xff0c;随着互联网和数字化时代的到来&#xff0c;企业都向数字化转型&#xff0c;对于信息…

二、Linux用户管理

Linux是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须向系统管理员申请一个账户&#xff0c;然后用这个账户进入系统。 每个Linux用户至少属于一个用户组。 用户家目录home下&#xff0c;有各个用户分别创建的家目录&#xf…