地址 https://leetcode-cn.com/problems/range-sum-query-mutable/

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

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

  1. 示例:
  2.  
  3. Given nums = [, , ]
  4.  
  5. sumRange(, ) ->
  6. update(, )
  7. sumRange(, ) ->
  8. 说明:
  9.  
  10. 数组仅可以在 update 函数下进行修改。
  11. 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。

算法1
区间求和 自然使用 线段树 或者线段数组
这里以线段树为例
以 空间换时间 记录线段之间的和 最大最小值等
由于是树 即使其中一部分元素改变或者某一个元素改变 更改记录也只是log(n)的复杂度

  1. class SegmentTreeNode {
  2. public:
  3. SegmentTreeNode(int start,int end,int sum,
  4. SegmentTreeNode* left = nullptr,
  5. SegmentTreeNode* right = nullptr):
  6. start(start),
  7. end(end),
  8. sum(sum),
  9. left(left),
  10. right(right){}
  11. SegmentTreeNode(const SegmentTreeNode&) = delete;
  12. SegmentTreeNode& operator=(const SegmentTreeNode&) = delete;
  13. ~SegmentTreeNode() {
  14. delete left;
  15. delete right;
  16. left = right = nullptr;
  17. }
  18.  
  19. int start;
  20. int end;
  21. int sum;
  22. SegmentTreeNode* left;
  23. SegmentTreeNode* right;
  24. };
  25.  
  26. class NumArray {
  27. public:
  28. NumArray(vector<int> nums) {
  29. nums_.swap(nums);
  30. if (!nums_.empty())
  31. root_.reset(buildTree(, nums_.size() - ));
  32. }
  33.  
  34. void update(int i, int val) {
  35. updateTree(root_.get(), i, val);
  36. }
  37.  
  38. int sumRange(int i, int j) {
  39. return sumRange(root_.get(), i, j);
  40. }
  41. private:
  42. vector<int> nums_;
  43. std::unique_ptr<SegmentTreeNode> root_;
  44.  
  45. SegmentTreeNode* buildTree(int start, int end) {
  46. if (start == end) {
  47. return new SegmentTreeNode(start, end, nums_[start]);
  48. }
  49. int mid = start + (end - start) / ;
  50. auto left = buildTree(start, mid);
  51. auto right = buildTree(mid + , end);
  52. auto node = new SegmentTreeNode(start, end, left->sum + right->sum,
  53. left, right);
  54.  
  55. return node;
  56. }
  57.  
  58. void updateTree(SegmentTreeNode* root, int i, int val) {
  59. if (root->start == i && root->end == i) {
  60. root->sum = val;
  61. return;
  62. }
  63. int mid = root->start + (root->end - root->start) / ;
  64. if (i <= mid) {
  65. updateTree(root->left, i, val);
  66. }
  67. else {
  68. updateTree(root->right, i, val);
  69. }
  70. root->sum = root->left->sum + root->right->sum;
  71. }
  72.  
  73. int sumRange(SegmentTreeNode* root, int i, int j) {
  74. if (i == root->start && j == root->end) {
  75. return root->sum;
  76. }
  77. int mid = root->start + (root->end - root->start) / ;
  78. if (j <= mid) {
  79. return sumRange(root->left, i, j);
  80. }
  81. else if (i > mid) {
  82. return sumRange(root->right, i, j);
  83. }
  84. else {
  85. return sumRange(root->left, i, mid) + sumRange(root->right, mid + , j);
  86. }
  87. }
  88. };

LeetCode 307. 区域和检索 - 数组可修改的更多相关文章

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

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

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

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

  3. [Leetcode] 第307题 区域和检索-数组可修改

    参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree) 一.题目描述 给定一个整数数组  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. LeetCode:区域和检索【303】

    LeetCode:区域和检索[303] 题目描述 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [ ...

  6. [Leetcode]303.区域和检索&&304.二维区域和检索

    题目 1.区域和检索: 简单题,前缀和方法 乍一看就觉得应该用前缀和来做,一个数组多次查询. 实现方法: 新建一个private数组prefix_sum[i],用来存储nums前i个数组的和, 需要找 ...

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

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

  8. [Swift]LeetCode303. 区域和检索 - 数组不可变 | Range Sum Query - Immutable

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

  9. C#LeetCode刷题-树状数组

    树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 ...

随机推荐

  1. [转载]MGR变量group_replication_primary_member

    组复制的状态变量只有一个,目前在8.0.17这个版本上还是存在的,未来会被废弃掉,我们在单主的模式下,可以用来查看哪个节点是读写节点. mysql: [Warning] Using a passwor ...

  2. 表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和

    上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中.不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和 ...

  3. [Go] 实现websocket服务端

    直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket 如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/gol ...

  4. 011.Kubernetes二进制部署kube-scheduler

    一 部署高可用kube-scheduler 1.1 高可用kube-scheduler介绍 本实验部署一个三实例 kube-scheduler 的集群,启动后将通过竞争选举机制产生一个 leader ...

  5. 如何将pyqt5的qt-designer设计出来的 .ui 和 .qrc 文件转化成 .py 文件

    一.pyrcc5的使用 1.1 作用 将 .qrc 资源文件转换成py文件,并在主程序中通过 import 引入 1.2 资源文件编写说明 创建一个icon.qrc,代码如下: <RCC> ...

  6. 安装oracle11g客户端

    1.将压缩包instantclient_11_2 解压到数据库安装目录下(D:\app\hisoft\product\11.2.0),即与dbhome_1同级目录 2.添加环境变量 至此,oracle ...

  7. iconv转换

    /////////////////////////////////////////////////////// #include <iconv.h> #include <stdlib ...

  8. [译]Vulkan教程(08)逻辑设备和队列

    [译]Vulkan教程(08)逻辑设备和队列 Introduction 入门 After selecting a physical device to use we need to set up a  ...

  9. jQuery 源码解析(二十二) DOM操作模块 复制元素 详解

    本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...

  10. 基于STM32F429,Cubemx的SAI音频播放实验

    书接上文:https://www.cnblogs.com/feiniaoliangtiangao/p/11060674.html 和 https://www.cnblogs.com/feiniaoli ...