当前位置: 首页 > news >正文

​LeetCode解法汇总307. 区域和检索 - 数组可修改

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个数组 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 * 104
  • -100 <= nums[i] <= 100
  • 0 <= index < nums.length
  • -100 <= val <= 100
  • 0 <= left <= right < nums.length
  • 调用 update 和 sumRange 方法次数不大于 3 * 104 

解题思路:

这题数组的长度为310^4,如果时间复杂度是O(n2),则会超时。所以这题一定不能每次都遍历。 
但是我们可以发现一个规律,就是update的时候,影响的范围很小,甚至有可能都对sumRange不产生影响,所以,我们可以把影响范围缩减到最小。
我们可以把nums数组划分为k块,暂且用N1,N2,Nk表示,则left和right会出现2种情况。 
left和right属于同一块:这种情况,直接求left和right的累加值即可。 
left和right不属于同一块:这种情况,求left到其所属块的尾之间的和,right所属的块的头到right之间的和,以及left和right之间的块的和。三者相加,就是最终值。

代码:

class NumArray {private int[] nums;private int[] pieces;private int pieceLength;public NumArray(int[] nums) {this.nums = nums;pieceLength = (int) Math.ceil(Math.sqrt(nums.length));pieces = new int[nums.length / pieceLength + 1];for (int i = 0; i < nums.length; i++) {pieces[i / pieceLength] = pieces[i / pieceLength] + nums[i];}}public void update(int index, int val) {pieces[index / pieceLength] += (val-nums[index]);nums[index] = val;}public int sumRange(int left, int right) {int piece1 = left / pieceLength;int piece2 = right / pieceLength;int sum1 = 0, sum2 = 0, sum3 = 0;if (piece1 == piece2) {for (int i = left; i <= right; i++) {sum1 += nums[i];}} else {for (int i = left; i < pieceLength * (piece1+1); i++) {sum1 += nums[i];}for (int i = pieceLength * piece2; i <= right; i++) {sum3 += nums[i];}for (int i = piece1 + 1; i < piece2; i++) {sum2 += pieces[i];}}int sum = sum1 + sum2 + sum3;return sum;}}

相关文章:

  • VIM去掉utf-8 bom头
  • QStatusBar开发详解
  • 第三十三节——组合式API生命周期
  • 使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)
  • python+appium自动化测试如何控制App的启动和退出
  • Java排序算法之希尔排序
  • nginx服务器
  • golang学习笔记——基础02
  • 滚雪球学Java(09-3):Java中的逻辑运算符,你真的掌握了吗?
  • 20个Golang最佳实践
  • 模拟滴答声
  • 零代码编程:用ChatGPT自动合并多个Word文件
  • Tensorflow2.0:CNN、ResNet实现MNIST分类识别
  • 宝塔https403默认串站问题解决
  • 【数据结构】树与二叉树(十八):树的存储结构——Father链接结构、儿子链表链接结构
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular数据绑定机制
  • HTTP那些事
  • JavaWeb(学习笔记二)
  • React-生命周期杂记
  • Redis在Web项目中的应用与实践
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue 配置sass、scss全局变量
  • 番外篇1:在Windows环境下安装JDK
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 让你的分享飞起来——极光推出社会化分享组件
  • 项目实战-Api的解决方案
  • 移动端高清、多屏适配方案
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (2022 CVPR) Unbiased Teacher v2
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) Face-Resources
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 读取 JSON格式的数据
  • /proc/vmstat 详解
  • @Autowired @Resource @Qualifier的区别
  • @Autowired自动装配
  • @DataRedisTest测试redis从未如此丝滑
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20150904]exp slow.txt
  • [BZOJ3757] 苹果树
  • [C++]二叉搜索树
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [echarts] y轴不显示0
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等