LeetCode题练习与总结:区域和检索 - 数组可修改--307

一、题目描述

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

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

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -100 <= nums[i] <= 100
  • 0 <= index < nums.length
  • -100 <= val <= 100
  • 0 <= left <= right < nums.length
  • 调用 update 和 sumRange 方法次数不大于 3 * 10^4 

二、解题思路

这个问题可以通过使用一个数据结构来优化区间和查询的效率,这个数据结构通常被称为树状数组(Binary Indexed Tree, BIT)或者线段树(Segment Tree)。由于树状数组在实现上较为简洁,我们这里采用树状数组来解决问题。

解题思路:

  1. 使用一个额外的数组 tree 来构建树状数组,其中 tree[i] 用于存储从 nums[i - 2^r + 1] 到 nums[i] 的元素和,这里 r 是 i 二进制表示中最低位的 1 所在的位置。
  2. 在 NumArray 构造函数中初始化树状数组。
  3. 在 update 方法中,首先计算出需要更新的元素的新值与旧值的差值,然后更新 nums 数组中对应位置的值,接着更新树状数组。
  4. 在 sumRange 方法中,计算从 left 到 right 的区间和。

三、具体代码

class NumArray {private int[] nums;private int[] tree;private int n;public NumArray(int[] nums) {this.nums = nums;this.n = nums.length;this.tree = new int[n + 1];for (int i = 0; i < n; i++) {add(i + 1, nums[i]);}}public void update(int index, int val) {int delta = val - nums[index];nums[index] = val;add(index + 1, delta);}public int sumRange(int left, int right) {return query(right + 1) - query(left);}private void add(int index, int val) {while (index <= n) {tree[index] += val;index += index & -index;}}private int query(int index) {int sum = 0;while (index > 0) {sum += tree[index];index -= index & -index;}return sum;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 构造函数 NumArray(int[] nums):

    • 初始化树状数组的时间复杂度是 O(n),因为我们需要遍历数组 nums 并对每个元素调用一次 add 方法。
    • add 方法的时间复杂度是 O(log n),因为每次更新树状数组时,我们只需要更新 log n 个节点。
    • 因此,构造函数总的时间复杂度是 O(n * log n)
  • update(int index, int val) 方法:

    • 计算差值 delta 的时间复杂度是 O(1)
    • 更新 nums 数组的时间复杂度是 O(1)
    • 调用 add 方法的时间复杂度是 O(log n)
    • 因此,update 方法总的时间复杂度是 O(log n)
  • sumRange(int left, int right) 方法:

    • 调用两次 query 方法,每次的时间复杂度是 O(log n)
    • 因此,sumRange 方法总的时间复杂度是 O(log n)
2. 空间复杂度
  • 构造函数 NumArray(int[] nums):

    • 需要一个与 nums 同样长度的数组 tree 来存储树状数组,因此空间复杂度是 O(n)
    • nums 数组本身也需要 O(n) 的空间。
    • 因此,构造函数总的空间复杂度是 O(n)
  • update(int index, int val) 方法:

    • 这个方法不需要额外的空间,除了修改 nums 和 tree 数组中已有的元素,因此空间复杂度是 O(1)
  • sumRange(int left, int right) 方法:

    • 这个方法同样不需要额外的空间,只需要计算两个 query 方法的差值,因此空间复杂度是 O(1)

综上所述,整个 NumArray 类的时间复杂度和空间复杂度如下:

  • 时间复杂度:

    • 构造函数:O(n * log n)
    • update 方法:O(log n)
    • sumRange 方法:O(log n)
  • 空间复杂度:

    • 总空间复杂度:O(n)

五、总结知识点

  • 树状数组(Binary Indexed Tree, BIT)

    • 树状数组是一种用于高效计算和更新前缀和的数据结构。
    • 它通过使用数组来模拟树形结构,使得每个节点的父节点可以通过位运算快速定位。
  • 位运算

    • 代码中使用了位运算 index & -index 来找到当前节点的父节点,这是树状数组的一个关键特性。
    • 该操作能够提取出 index 二进制表示中最低位的 1,从而实现快速更新和查询。
  • 前缀和

    • query 方法通过累加树状数组中的值来计算前缀和,这是树状数组的核心功能之一。
  • 数组操作

    • 在 update 方法中,通过计算新旧值的差值来更新树状数组,而不是直接替换,这样可以保持树状数组的正确性。
  • 类的封装

    • NumArray 类封装了树状数组的操作,对外提供了 update 和 sumRange 两个接口,隐藏了实现的细节。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

46 C 语言文件的打开与关闭、写入与读取函数:fopen、fclose、fputc、fputs、fprintf、fgetc、fgets、fscanf

目录 1 文件的存储形式 2 打开文件——fopen() 函数 2.1 功能描述 2.2 函数原型 2.3 文件打开方式&#xff08;模式&#xff09; 3 关闭文件——fclose() 函数 3.1 功能描述 3.2 函数原型 4 常见的文件写入方式 4.1 fputc() 函数 4.1.1 功能描述 4.1.2 函数原型 4…

windows自动化(一)---windows关闭熄屏和屏保

电脑设置关闭屏幕和休眠时间不起作用解决方案 一共三个方面注意&#xff1a; 一、关闭屏保设置&#xff1a; 二、电源管理设置 三、关闭盖子不做操作&#xff1a; 第一点很重要&#xff0c;就算二三都做了&#xff0c;一没做&#xff0c;照样不行。

一篇python的pandas数据分析,分组与聚合使用!

在数据分析中,数据分组与聚合是常用的操作,能够帮助我们从大量数据中提取出有用的信息.我们讨论了描述性统计,了解了如何通过均值、方差等统计量概述数据的特征.而在本篇中,我们将学习如何对数据进行分组和聚合,以便进行更深入的分析.最后,我们将在后续的章节中使用这些分析结果…

PHP政务招商系统——高效连接共筑发展蓝图

政务招商系统——高效连接&#xff0c;共筑发展蓝图 &#x1f3db;️ 一、政务招商系统&#xff1a;开启智慧招商新篇章 在当今经济全球化的背景下&#xff0c;政务招商成为了推动地方经济发展的重要引擎。而政务招商系统的出现&#xff0c;更是为这一进程注入了新的活力。它…

ES(Elasticsearch)SSL集群部署

8.x后ES不在需要自行准备JDK环境&#xff0c;部署的服务包含ES、Kibana、Logstash&#xff0c;使用二进制方式部署&#xff0c;为了提高安全性&#xff0c;加密logstash、kibana及其他客户端到ES间的通信。 1、准备工作 1.1、 es无法使用root用户启动 useradd -m -s /bin/bas…

WebGl 使用uniform变量动态修改点的颜色

在WebGL中&#xff0c;uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息&#xff0c;这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享&#xff0c;因此可以被所有使用该着色…

【C#网络编程】基础概念2

文章目录 网络、数据包和协议网络数据包协议TCP、UDP 地址客户端和服务器套接字 网络、数据包和协议 计算机网络通过通信通道互连的机器组成&#xff0c;通常把这些机器称为主机和路由器&#xff0c;主机是是运行应用程序&#xff08;如 Web 浏览器&#xff09;的计算机。路由器…

决战Linux操作系统

前言&#xff1a; 你是否也曾经为Linux所困扰过&#xff0c;在网上找的资料零零散散&#xff0c;是否学完Linux后还是懵懵懂懂&#xff0c;别怕&#xff0c;这篇博客是博主精心为你准备的&#xff0c;现在&#xff0c;就让我们一起来走进Linux的世界&#xff0c;决战Linux&…

一文详解数据库范式

背景 在开发中&#xff0c;我们经常需要考虑如何设计合适的表结构&#xff0c;而则往往需要考虑数据库的范式。数据库的三范式&#xff08;3NF&#xff09;是数据库设计过程中用来减少数据冗余和提高数据一致性的重要规则。它们分别是第一范式&#xff08;1NF&#xff09;、第二…

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时&#xff0c;全表查询会报错&#xff1a; 这时候如果有前面正常的rman备份&#xff0c;那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查&#xff1a; RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

C#中Assembly3个获取路径的方法

在C#中&#xff0c;经常要获取路径 &#xff0c;可以通过Assembly的三个重载方法来获取&#xff0c;如下所示这三个分别是GetCallingAssembly、GetEntryAssembly和GetExecutingAssembly。 string tmpEntryPath Assembly.GetEntryAssembly().Location;string tmpExeasmPath As…

STM32CubeIDE使用ADC采用DMA重大BUG

问题描述 STM32CubeIDE 1.8.0问题 大牛攻城狮最近调试STM32L151CBT6。由于项目上使用该款芯片做控制电源使用&#xff0c;其中涉及到多路ADC的数据采样。使用STM32CubeIDE 1.8.0版本详细如下图所示 这里大概率是STM32CubeMX版本太低了&#xff0c;从图上看才是6.4.0 注意这里…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot&#xff08;UI基类&#xff09; 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中&#xff0c;继承了基类的两个方法&#xff0c;设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

25.1 降低采集资源消耗的收益和无用监控指标的判定依据

本节重点介绍 : 降低采集资源消耗的收益哪些是无用指标&#xff0c;什么判定依据 通过 grafana的 mysql 表获取所有的 查询表达式expr通过 获取所有的prometheus rule文件获取所有的 告警表达式expr通过 获取所有的prometheus 采集器接口 获取所有的采集metrics计算可得到现在…

机器学习、深度学习评价指标汇总:TP、TN、FP、FN、AP、mAP、IoU、mAP@3、Prec@10、 Acc@10

系列文章目录 文章目录 系列文章目录一、真正例&#xff08;True Positive&#xff09;、假正例&#xff08;False Positive&#xff09;、真负例&#xff08;True Negative&#xff09;和假负例&#xff08;False Negative&#xff09;是评估分类模型性能的重要概念。1. 定义2…

前端学习-css的元素显示模式(十五)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 什么是元素显示模式 块元素 常见的块元素 块元素的特点 注意 行内元素 行内元素的特点 注意 行内块元素 行内块元素的特点 元素显示模式的转换 语法格…

MySQL 删除数据库

1.使用命令行删除一个数据库 1.1 首先登陆进入 MySQL 操作界面&#xff0c;命令如下&#xff1a; 命令 : mysql -utest -p;1.2 登陆成功之后可以使用如下命令查看当前已有数据库&#xff1a; 命令 : SHOW DATABASES; 执行结果如下图: 如图所示当前已包含 MySQL 系统数据库和…

盛元广通化学实验室样品LIMS管理系统

盛元广通化学实验室样品LIMS管理系统旨在提高实验室样品管理的效率、准确性和可追溯性。通过自动化和智能化的手段&#xff0c;系统能够简化样品管理流程&#xff0c;减少人为错误&#xff0c;确保样品的安全性和完整性。样品管理的具体实施方法包括样品接收与登记、样品储存与…

「Ubuntu」文件权限说明(drwxr-xr-x)

我们在使用Ubuntu 查看文件信息时&#xff0c;常常使用 ll 命令查看&#xff0c;但是输出的详细信息有些复杂&#xff0c;特别是 类似与 drwxr-xr-x 的字符串&#xff0c;在此进行详细解释下 属主&#xff1a;所属用户 属组&#xff1a;文件所属组别 drwxr-xr-x 7 apps root 4…

基于SSM的商场鞋店管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 题目简介&#xff1a; 服装鞋帽在我国的国民经济的发展中有着重要的地位&#xff0c;是发展规模较为宏大的行业。随着我国制鞋企业的发展和规模的扩大&#xff0c;经营区域分散&#xff0c;传统的管理模式严重制约了企业的快速…