LeetCode 307. 区域和检索 - 数组可修改
地址 https://leetcode-cn.com/problems/range-sum-query-mutable/
题目描述
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
- 示例:
- Given nums = [, , ]
- sumRange(, ) ->
- update(, )
- sumRange(, ) ->
- 说明:
- 数组仅可以在 update 函数下进行修改。
- 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。
算法1
区间求和 自然使用 线段树 或者线段数组
这里以线段树为例
以 空间换时间 记录线段之间的和 最大最小值等
由于是树 即使其中一部分元素改变或者某一个元素改变 更改记录也只是log(n)的复杂度
- class SegmentTreeNode {
- public:
- SegmentTreeNode(int start,int end,int sum,
- SegmentTreeNode* left = nullptr,
- SegmentTreeNode* right = nullptr):
- start(start),
- end(end),
- sum(sum),
- left(left),
- right(right){}
- SegmentTreeNode(const SegmentTreeNode&) = delete;
- SegmentTreeNode& operator=(const SegmentTreeNode&) = delete;
- ~SegmentTreeNode() {
- delete left;
- delete right;
- left = right = nullptr;
- }
- int start;
- int end;
- int sum;
- SegmentTreeNode* left;
- SegmentTreeNode* right;
- };
- class NumArray {
- public:
- NumArray(vector<int> nums) {
- nums_.swap(nums);
- if (!nums_.empty())
- root_.reset(buildTree(, nums_.size() - ));
- }
- void update(int i, int val) {
- updateTree(root_.get(), i, val);
- }
- int sumRange(int i, int j) {
- return sumRange(root_.get(), i, j);
- }
- private:
- vector<int> nums_;
- std::unique_ptr<SegmentTreeNode> root_;
- SegmentTreeNode* buildTree(int start, int end) {
- if (start == end) {
- return new SegmentTreeNode(start, end, nums_[start]);
- }
- int mid = start + (end - start) / ;
- auto left = buildTree(start, mid);
- auto right = buildTree(mid + , end);
- auto node = new SegmentTreeNode(start, end, left->sum + right->sum,
- left, right);
- return node;
- }
- void updateTree(SegmentTreeNode* root, int i, int val) {
- if (root->start == i && root->end == i) {
- root->sum = val;
- return;
- }
- int mid = root->start + (root->end - root->start) / ;
- if (i <= mid) {
- updateTree(root->left, i, val);
- }
- else {
- updateTree(root->right, i, val);
- }
- root->sum = root->left->sum + root->right->sum;
- }
- int sumRange(SegmentTreeNode* root, int i, int j) {
- if (i == root->start && j == root->end) {
- return root->sum;
- }
- int mid = root->start + (root->end - root->start) / ;
- if (j <= mid) {
- return sumRange(root->left, i, j);
- }
- else if (i > mid) {
- return sumRange(root->right, i, j);
- }
- else {
- return sumRange(root->left, i, mid) + sumRange(root->right, mid + , j);
- }
- }
- };
LeetCode 307. 区域和检索 - 数组可修改的更多相关文章
- Java实现 LeetCode 307 区域和检索 - 数组可修改
307. 区域和检索 - 数组可修改 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. update(i, val) 函数可以通过将下标 ...
- Java实现 LeetCode 303 区域和检索 - 数组不可变
303. 区域和检索 - 数组不可变 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [-2, 0, 3, ...
- [Leetcode] 第307题 区域和检索-数组可修改
参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree) 一.题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ...
- [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 ...
- LeetCode:区域和检索【303】
LeetCode:区域和检索[303] 题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [ ...
- [Leetcode]303.区域和检索&&304.二维区域和检索
题目 1.区域和检索: 简单题,前缀和方法 乍一看就觉得应该用前缀和来做,一个数组多次查询. 实现方法: 新建一个private数组prefix_sum[i],用来存储nums前i个数组的和, 需要找 ...
- 【leetcode 简单】 第七十九题 区域和检索 - 数组不可变
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数 ...
- [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 ...
- C#LeetCode刷题-树状数组
树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 ...
随机推荐
- [转载]MGR变量group_replication_primary_member
组复制的状态变量只有一个,目前在8.0.17这个版本上还是存在的,未来会被废弃掉,我们在单主的模式下,可以用来查看哪个节点是读写节点. mysql: [Warning] Using a passwor ...
- 表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和
上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中.不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和 ...
- [Go] 实现websocket服务端
直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket 如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/gol ...
- 011.Kubernetes二进制部署kube-scheduler
一 部署高可用kube-scheduler 1.1 高可用kube-scheduler介绍 本实验部署一个三实例 kube-scheduler 的集群,启动后将通过竞争选举机制产生一个 leader ...
- 如何将pyqt5的qt-designer设计出来的 .ui 和 .qrc 文件转化成 .py 文件
一.pyrcc5的使用 1.1 作用 将 .qrc 资源文件转换成py文件,并在主程序中通过 import 引入 1.2 资源文件编写说明 创建一个icon.qrc,代码如下: <RCC> ...
- 安装oracle11g客户端
1.将压缩包instantclient_11_2 解压到数据库安装目录下(D:\app\hisoft\product\11.2.0),即与dbhome_1同级目录 2.添加环境变量 至此,oracle ...
- iconv转换
/////////////////////////////////////////////////////// #include <iconv.h> #include <stdlib ...
- [译]Vulkan教程(08)逻辑设备和队列
[译]Vulkan教程(08)逻辑设备和队列 Introduction 入门 After selecting a physical device to use we need to set up a ...
- jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...
- 基于STM32F429,Cubemx的SAI音频播放实验
书接上文:https://www.cnblogs.com/feiniaoliangtiangao/p/11060674.html 和 https://www.cnblogs.com/feiniaoli ...