【刷题日记】307. 区域和检索 - 数组可修改

简介: 本次刷题日记的第 24 篇,力扣题为:307. 区域和检索 - 数组可修改 ,中等

【刷题日记】307. 区域和检索 - 数组可修改

本次刷题日记的第 24 篇,力扣题为:307. 区域和检索 - 数组可修改中等

一、题目描述:

image.png

清明小长假第 2 天,咱们再来继续刷 leetcode 每日一题

看到这道题啥感受,我的第一感受就是可能我出去玩的时间要被缩减了,诶,就是菜


这道题可能和其他的题还不太一样,这算是写一个微小的功能,而不是仅仅写一个函数,不过没事,我们仍然可以解决他,来我们一起来分析一波

二、这道题考察了什么思想?你的思路是什么?

咱们仔细看这道题,给出了我们哪些重点信息呢:

  • 题目给出的已知条件,具体的操作数和具体的数组,对我们有 2 个要求,第 1 就是通过 update 来将指定索引位置上的值修改成期望的值,第 2 就是给出左右区间,我们可以迅速的查询出他们的区间和
  • 看了这个题,我们需要完成这么几件事情:
  • 完成对 NumArray 的定义
  • 构造函数的处理
  • Update 函数的实现
  • SumRange 函数的实现

对于没有这类题刷题经验的我们来说,稍微思考一下,倒是可以写出能够计算出期望结果的代码,那就是常规做法,遍历数组,累加

类似于这样的做法:

image.png

你要说这种代码有啥问题吗?

你说有问题吧,其实他也解决了部分问题,你说没有问题吧,其实他对于用例数据量很大的时候,会超时,是没有办法 AC 的

那么我们就要考虑别的方式了,思考了一下,暂时先用一个简单的方法来计算区间和吧

咱们可以使用分段分组的方式来处理

此处我们使用一个示例来推演一下如何计算区间和的,对于 update 函数的话,这个就不做过多解释了

例如我们可以自定义一个示例,对应的数组是 [1, 3, 4, 5, 7, 8, 9],那么咱们来看图

image.png

根据上述的示例推演的话,xdm 也可以自己自定义一个例子来推演一下,就能很快的理解了


三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,此处需要注意 SumRange 的情况分类

编码如下:

type NumArray struct {
    nums ,sums[]int
    size int
}
func Constructor(nums []int) NumArray {
    length := len(nums)
    size :=int(math.Sqrt(float64(length))) 
    // 定义个记录每一块区间和的切片,大小为
    sums := make([]int,(length / size)+1)
    for i,n := range nums{
        // 对于每一个区间求和
        sums[i/size] += n
    }
    return NumArray{nums,sums,size}
}
func (this *NumArray) Update(index int, val int)  {
    // 处理该值所在区间的数字
    this.sums[index/this.size] += val - this.nums[index]
    this.nums[index] = val
}
func (this *NumArray) SumRange(left int, right int) (ans int) {
    a := left/this.size
    b := right/this.size
    // 说明 left 和 right 对应的区间是同一块
    if a == b{
        for i:=left;i<=right;i++ {
         ans += this.nums[i]
        }
        return
    }
    // left 和 right 不是同一块,至少是 2 块以上的情况
    // 处理  left 到 所在块的内容
    for i := left ; i<(a+1)*this.size;i++{
         ans += this.nums[i]
    }
    // 处理left 下一块到 right 所在块的内容,此处正好可以使用 sum 数组中的内容
    for i :=a+1;i<b;i++{
         ans += this.sums[i]
    }
    // 处理 right 所在块的起点,到 right 的内容
    for i:=b*this.size;i<= right ;i++ {
        ans += this.nums[i]
    }
    return
}


四、总结:

本次题目的时间复杂度是就需要按照函数来区分了

  • Constructor 时间复杂度是 O(n) ,
  • update 时间复杂度是 O(1)
  • SumRange 时间复杂度是 O(根号 n)

空间复杂度的话,咱们是引入了一个 sums 数组和 ,咱们 sums 的数组长度,取决于咱们切割数组的份数,因此是 O(根号n)

原题地址:307. 区域和检索 - 数组可修改

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
Linux Shell 网络安全
通过Docker创建CentOS系统容器的步骤
通过Docker创建CentOS系统容器的步骤
776 0
|
安全 前端开发 PHP
[PiKaChu靶场通关]文件包含file include
[PiKaChu靶场通关]文件包含file include
898 0
[PiKaChu靶场通关]文件包含file include
|
8月前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
523 92
|
7月前
|
人工智能 API
DeepSeek-5min部署体验
本文介绍如何通过阿里云平台免费部署属于自己的DeepSeek AI助理,实现0成本打造满血DeepSeek。文中详细描述了创建API-KEY、下载Chatbox及配置自定义提供方的步骤,并展示了AI助理在不同场景下的表现。总结中提到,尽管部分复杂问题处理稍显卡顿,但整体准确性较高,基本满足日常需求。对于专业需求,建议探索使用自有数据集进行微调以提升性能。
171 2
|
7月前
|
运维 监控 网络协议
CURL库网页爬取:从错误处理到结果验证
CURL库网页爬取:从错误处理到结果验证
|
机器学习/深度学习 数据可视化 Linux
python用ARIMA模型预测CO2浓度时间序列实现
python用ARIMA模型预测CO2浓度时间序列实现
|
机器学习/深度学习 算法 异构计算
使用mergekit 合并大型语言模型
模型合并是近年来兴起的一种新技术。它允许将多个模型合并成一个模型。这样做不仅可以保持质量,还可以获得额外的好处。
565 1
|
DataWorks Java 调度
DataWorks产品使用合集之进行离线同步时,如何使用DataX的Reader插件来实现源端过滤
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
191 0
DataWorks产品使用合集之进行离线同步时,如何使用DataX的Reader插件来实现源端过滤
|
算法 API
全新Self-RAG框架亮相,自适应检索增强助力超越ChatGPT与Llama2,提升事实性与引用准确性
全新Self-RAG框架亮相,自适应检索增强助力超越ChatGPT与Llama2,提升事实性与引用准确性
全新Self-RAG框架亮相,自适应检索增强助力超越ChatGPT与Llama2,提升事实性与引用准确性
|
API Python
Python中使用pyzbar实现二维码生成和识别功能
Python中使用pyzbar实现二维码生成和识别功能
1500 0