题目:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-mutable
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

方法一:暴力法(无法通过,超时)

方法二:树状数组

解题思路:

方法一:暴力法

暴力法真的就不用说了,就按照题目要求写就可以。但是这个方法会超时。

方法二:树状数组

树状数组我也是先看题解,然后了解了下才明白其妙用。

当一个数字变化的时候,它对应的父节点也会产生变化。

树状数组学习参考:树状数组 数据结构详解与模板(可能是最详细的了)_bestsort的博客-CSDN博客_树状数组

这位大大的博客用图形说明了树状数组,对照这个图就能够理解我们这题是怎么做的啦!

代码:

方法一:

typedef struct {int numsSize;int *nums;
} NumArray;NumArray* numArrayCreate(int* nums, int numsSize) {NumArray *obj = (NumArray *)malloc(sizeof(NumArray));//obj->nums = (int *)malloc(sizeof(int) * numsSize);obj->numsSize = numsSize;obj->nums = nums;//for (int i = 0; i < numsSize; i++) {//    obj->nums[i] = nums[i];//}return obj;
}void numArrayUpdate(NumArray* obj, int index, int val) {obj->nums[index] = val;
}int numArraySumRange(NumArray* obj, int left, int right) {int sum = 0;for (; left <= right; left++, right--) {if (left != right) {sum = sum + obj->nums[left] + obj->nums[right];} else {sum += obj->nums[left];}}return sum;
}void numArrayFree(NumArray* obj) {//free(obj->nums);free(obj);obj = NULL;
}/*** Your NumArray struct will be instantiated and called as such:* NumArray* obj = numArrayCreate(nums, numsSize);* numArrayUpdate(obj, index, val);* int param_2 = numArraySumRange(obj, left, right);* numArrayFree(obj);
*/

方法二:

typedef struct {int treeSize;int *nums;int *tree;
} NumArray;int lowBit(int a)
{return a & (-a);
}void Add(int *tree, int treeSize, int index, int value)
{while (index < treeSize) {tree[index] += value;index += lowBit(index);}
}int Sum(int *tree, int index)
{int sum = 0;while (index > 0) {sum += tree[index];index -= lowBit(index);}return sum;
}NumArray* numArrayCreate(int* nums, int numsSize) {NumArray *obj = (NumArray *)malloc(sizeof(NumArray));obj->treeSize = numsSize + 1;obj->nums = nums;obj->tree = (int *)malloc(sizeof(int) * obj->treeSize);memset(obj->tree, 0, sizeof(int) * obj->treeSize);for (int i = 0; i < numsSize; i++) {Add(obj->tree, obj->treeSize, i + 1, nums[i]);}return obj;
}void numArrayUpdate(NumArray* obj, int index, int val) {Add(obj->tree, obj->treeSize, index + 1, val - obj->nums[index]);obj->nums[index] = val;
}int numArraySumRange(NumArray* obj, int left, int right) {return Sum(obj->tree, right + 1) - Sum(obj->tree, left);
}void numArrayFree(NumArray* obj) {free(obj->tree);free(obj);obj = NULL;
}/*** Your NumArray struct will be instantiated and called as such:* NumArray* obj = numArrayCreate(nums, numsSize);* numArrayUpdate(obj, index, val);* int param_2 = numArraySumRange(obj, left, right);* numArrayFree(obj);
*/

C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改相关推荐

  1. C练题笔记之:Leetcode-303. 区域和检索 - 数组不可变

    题目: 给定一个整数数组  nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...

  2. 307. Range Sum Query - Mutable | 307. 区域和检索 - 数组可修改(数据结构:线段树,图文详解)

    题目 https://leetcode.com/problems/range-sum-query-mutable/ 吐槽官方题解 这题的 英文版官方题解,配图和代码不一致,而且描述不清:力扣国内版题解 ...

  3. LeetCode 303. 区域和检索 - 数组不可变(前缀和)

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

  4. leetcode - 303.区域和检索-数组不可变(动态规划)

    303.区域和检索-数组不可变 ------------------------------------------ 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素 ...

  5. leetcode 303. 区域和检索 - 数组不可变(Java版)

    题目 303. 区域和检索 - 数组不可变 题解 经典的累加和问题. 定义一个数组 sum,存放数组从 0 到 sum 的累加和. 欲求某区间的累加和,只需将对应位置 sum 相减即可. 时间复杂度O ...

  6. 力扣刷题笔记--304 二维区域和检索 - 矩阵不可变 前缀和

    304 二维区域和检索 - 矩阵不可变 作者:AC_OIer 链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solu ...

  7. LeetCode中等题之区域和检索 - 数组可修改

    题目 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nu ...

  8. Leetcode 303.区域和检索 - 数组不可变

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

  9. leetcode -- 303. 区域和检索 - 数组不可变

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

最新文章

  1. 这是我看过,最好懂的神经网络
  2. html怎么引入sass样式,[样式设置] 使用sass格式的方式
  3. 熟知的CRM有哪些功能特点?
  4. 想说爱你不容易 | 使用最小 WEB API 实现文件上传
  5. 都会五星回评,欢迎留下地址-博客之星
  6. python的输入来源包括网络输入法_python可以调用计算机上的输入法进行输入吗?比如调用输入法在其他程序的输入框中写上字符串...
  7. Logistic分类函数
  8. 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420
  9. freertos 编译c++失败_FreeRTOS的初次见面
  10. java 强类型 弱类型_强类型,弱类型,静态类型,动态类型的区别
  11. mysql5.7.11解压安装_mysql 5.7.11解压安装教程
  12. java系列1 环境变量配置
  13. ajax返回数据类型为XML数据的处理
  14. win7计算机病毒制作教程,了解病毒的秘密,为win7打造安全盔甲
  15. React中关于props的那些事
  16. sqlite设密工具如何使用(本人资源)
  17. 选修课:唐宋词鉴赏课堂笔记03
  18. 2021年汽车驾驶员(技师)模拟考试软件及汽车驾驶员(技师)理论考试
  19. Ubuntu20.04安装有道词典记录
  20. 迅雷起死回生背后的男人,竟然是雷军

热门文章

  1. 【重磅!】Certihash正在与IBM合作开发一款名为“哨兵节点(Sentinel Node)”的网络安全检测工具
  2. 多模态 Generalized Visual Language Models
  3. VC窗口自由的调整大小的实现
  4. 小程序上传文字和图片到服务器并保存在数据库
  5. 从0到1搭建一个Spring Boot项目【第一个接口】
  6. python卡尔曼滤波融合_数据融合之卡尔曼滤波示例
  7. 做测试,你后悔过吗?
  8. 2022年全球市场预混鸡尾酒总体规模、主要生产商、主要地区、产品和应用细分研究报告
  9. HTML——HTML 简介
  10. 以太网工业RFID读写器|读卡器CK-FR12-E01接线说明与PLC组网方案