参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree)

一、题目描述

给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。

update(i, val) 函数可以通过将下标为 的数值更新为 val,从而对数列进行修改。

示例:

Given nums = [1, 3, 5]

sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

说明:

  1. 数组仅可以在 update 函数下进行修改。
  2. 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。

二、题目解析

像连续区间动态更新和查询这种问题,常常用线段树,树状数组等方法

很强大!!值得记录!

三、AC代码

 class NumArray {
public:
NumArray(vector<int> nums) {
root = buildTree(nums, , nums.size() - );
} void update(int i, int val) {
update(root, i, val);
} int sumRange(int i, int j) {
return sumRange(root, i, j);
}
private:
struct SegmentNode {
int start;
int end;
int sum;
SegmentNode* left;
SegmentNode* right;
SegmentNode(int start, int end) :start(start), end(end), sum() {}
};
SegmentNode *root;
SegmentNode* buildTree(vector<int>&nums, int start, int end) {//构建树
if (end < start)return NULL;
SegmentNode *node = new SegmentNode(start, end);
if (start == end) {
node->sum = nums[start];
return node;
}
int mid = start + (end - start) / ;
node->left = buildTree(nums, start, mid);
node->right = buildTree(nums, mid + , end);
node->sum = node->left->sum + node->right->sum;
return node;
}
void update(SegmentNode *node, int pos, int val) {
if (node->start == node->end&&node->start == pos) {//叶子节点
node->sum = val;
return;
}
if (pos<node->start || pos>node->end)return;
int mid = node->start + (node->end - node->start) / ;
if (pos <= mid) {
update(node->left, pos, val);//划分区间的时候,mid划分在左边
}
else {
update(node->right, pos, val);
}
node->sum = node->left->sum + node->right->sum;//更新sum
}
int sumRange(SegmentNode *node, int start, int end) {
if (node->start == start&&node->end == end) {
return node->sum;
}
int mid = node->start + (node->end - node->start)/;
if (end <= mid)return sumRange(node->left, start, end);//左子树中包含结果
if (start > mid)return sumRange(node->right, start, end);//右子树中包含结果,注意没有等号
else return sumRange(node->left, start, mid) + sumRange(node->right, mid + , end);
}
};

[Leetcode] 第307题 区域和检索-数组可修改的更多相关文章

  1. Java实现 LeetCode 307 区域和检索 - 数组可修改

    307. 区域和检索 - 数组可修改 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. update(i, val) 函数可以通过将下标 ...

  2. 【leetcode 简单】 第七十九题 区域和检索 - 数组不可变

    给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数 ...

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

    地址 https://leetcode-cn.com/problems/range-sum-query-mutable/ 题目描述给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤  ...

  4. [Swift]LeetCode307. 区域和检索 - 数组可修改 | Range Sum Query - Mutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  5. Java实现 LeetCode 303 区域和检索 - 数组不可变

    303. 区域和检索 - 数组不可变 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [-2, 0, 3, ...

  6. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  7. [LeetCode每日一题]80. 删除有序数组中的重复项 II

    [LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...

  8. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  9. Leetcode 304.二维区域和检索-矩阵不可变

    二维区域和检索 - 矩阵不可变 给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2). 上图子矩阵左上角 (row1, c ...

随机推荐

  1. AQS源码解析(一)-AtomicBoolean源码解析

    基本类: AtomicInteger AtomicLong AtomicBoolean 数组类型: AtomicIntegerArray AtomicLongArray AtomicReference ...

  2. 【JS档案揭秘】第四集 关于this的讨论到此为止

    网上关于this的指向问题的博客文章很多,但大多数都是复制粘贴,也不能用简洁的语言讲清楚,而是不停地写一些示例,看得人云里雾里. 这一集,我只给出结论,以及判定的通用方法,至于是否确实如我所讲,大家可 ...

  3. 后端开发实践系列之三——事件驱动架构(EDA)编码实践

    在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...

  4. Shell总结1

    1.错误输入重定向,将状态输入到d.txt 2.cut取列 free -m|grep “^Mem”|cut -d “ ” -f19   找内存 3. 4.cat看文件显示行号 5.查看文件空白行的行号 ...

  5. JSP学习笔记(1)——Jsp指令、动作元素和内置对象

    简单来说,javaweb技术就是让服务器端能够执行Java代码,之后返回数据给客户端(浏览器)让客户端显示数据 jsp页面中可以嵌套java代码(java小脚本)和嵌套Web前端(html,css,j ...

  6. 12_goto语句的使用

    1.goto是一个关键字,其作用是运行到goto语句进行跳转,立即执行goto后面所对应标签的语句2.结构:goto 标签名(任意起)3.goto语句尽量不要跨函数使用,否则会使代码看起来非常乱,可读 ...

  7. requests.get爬虫模块参数

    地址和请求头参数--url和header res = requests.get(url,headers=headers) 向网站发起请求,并获取响应对象 参数 url :需要抓取的URL地址 head ...

  8. TypeError: _obtain_input_shape() got an unexpected keyword argument 'include_top'

    报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/3.Keras/2.Application中五款 ...

  9. C 扩展对闭包特性的支持

    今日听说某君批评 C 语言说它[输入一个参数返回一个函数]很困难. 例如在 Python 中,你可以 def addn(n): def addx(x): return n + x return add ...

  10. gym/102091

    https://codeforces.com/gym/102091 2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest A Flying S ...