LeetCode 307. 区域和检索 - 数组可修改
程序员文章站
2024-03-05 15:35:07
...
307. 区域和检索 - 数组可修改
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
说明:
- 数组仅可以在 update 函数下进行修改。
- 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。
可以先看线段树:点击打开链接 某博主超详细教程
/*
题意:查询区间值,修改区间值
思路:线段树模板
*/
class NumArray {
public:
int* tree;
int size;
//建树
void build(int l,int r,int x,vector<int>& nums){
if(l==r) tree[x]=nums[l-1];
else{
int mid=(l+r)>>1;
build(l,mid,x<<1,nums);
build(mid+1,r,x<<1|1,nums);
tree[x]=tree[x<<1]+tree[x<<1|1];
}
}
//更新
void update(int pos,int l,int r,int val,int x){
if(l==r){
tree[x]=val;
return;
}else{
int mid=(l+r)>>1;
if(mid >= pos){
update(pos,l,mid,val,x<<1);
}else{
update(pos,mid+1,r,val,x<<1|1);
}
}
tree[x]=tree[x<<1]+tree[x<<1|1];
}
int query(int ll,int rr,int l,int r,int x){
if(ll<=l && r<=rr){
return tree[x];
}
int mid = (l+r)>>1;
int ans=0;
if(mid >= ll){
ans+=query(ll,rr,l,mid,x<<1);
}
if(rr>mid){
ans+=query(ll,rr,mid+1,r,x<<1|1);
}
return ans;
}
NumArray(vector<int> nums) {
size=nums.size();
tree = new int[size<<2];
if(size){
build(1,size,1,nums);
}
}
void update(int i, int val) {
update(i+1,1,size,val,1);
}
int sumRange(int i, int j) {
return query(i+1,j+1,1,size,1);
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* obj.update(i,val);
* int param_2 = obj.sumRange(i,j);
*/
上一篇: 关于vscode编辑器缩进的问题
推荐阅读
-
Leetcode 307. 区域和检索 - 数组可修改
-
LeetCode-307. 区域和检索 - 数组可修改
-
LeetCode 307. 区域和检索 - 数组可修改
-
Leetcode-307. 区域和检索 - 数组可修改 Range Sum Query - Mutable (线段树Segment Tree)-超详细Python
-
Leetcode-303.区域和检索-数组不可变
-
【Leetcode每日笔记】303. 区域和检索 - 数组不可变(Python)
-
Leetcode-303.区域和检索-数组不可变
-
【Leetcode每日笔记】303. 区域和检索 - 数组不可变(Python)
-
Leetcode 区域和检索 - 数组可修改
-
Java实现 LeetCode 307 区域和检索 - 数组可修改