lc307.区域和检索 - 数组可修改

暴力解法

创建方法,通过switch-case判断所需要调用的方法。

public class RegionsAndSertches {public static void main(String[] args) {String[] str = new String[]{"NumArray", "sumRange", "update", "sumRange"};int[][] arr = new int[][]{{1, 3, 5}, {0, 2}, {1, 2}, {0, 2}};invoke(str, arr);}public static void invoke(String[] str, int[][] arr) {//str表示上面一行字符串输入,arr表示下面一行二维数组输入NumArray numArray = new NumArray(arr[0]);//第一个必须为NumArray,一定要先创建对象,否则无法调用方法System.out.println("null");//根据题意返回nullfor (int i = 1; i < str.length; i++) {//跳过第一个,索引从1开始//根据输入的字符串判断需要执行哪个方法switch (str[i]) {case "sumRange"://调用sumRange方法,arr[i][0]为left,arr[i][1]为right,方法返回累加和System.out.println(numArray.sumRange(arr[i][0], arr[i][1]));break;case "update"://方法不返回,根据题意输出nullnumArray.update(arr[i][0], arr[i][1]);System.out.println("null");break;default:System.out.println("请输入sumRange或update以执行方法");}}}}class NumArray {public int[] nums;public NumArray(int[] nums) {//构造器this.nums = nums;//创建了哪个对象,this就表示哪个对象}public void update(int index, int val) {this.nums[index] = val;//题目表示nums[index],不考虑是否加减一}public int sumRange(int left, int right) {int sum = 0;//表示累加和for (int i = left; i <= right; i++) {//left和right都为索引,不用考虑是否加减一sum += this.nums[i];}return sum;}
}

分块处理

其中 n / size 向上取整

 

构造函数
  • 计算块大小size=根号n

  • 初始化sum块数组
update函数
  • 计算新的块数组sum
  • 更新nums数组
sumRange函数

class NumArray {private int[] sum; // sum[i] 表示第 i 个块的元素和private int size; // 块的大小private int[] nums;public NumArray(int[] nums) {this.nums = nums;int n = nums.length;size = (int) Math.sqrt(n);//size的值取根号n,此时的时间复杂度最优sum = new int[n / size + 1];//向上取整for (int i = 0; i < n; i++) {sum[i / size] += nums[i];}}public void update(int index, int val) {// index/size是sum数组的索引sum[index / size] = sum[index / size] - nums[index] + val;//更新sum数组nums[index] = val;//更新nums数组}public int sumRange(int left, int right) {int b1 = left / size, i1 = left % size, b2 = right / size, i2 = right % size;//因为是从b1这块数据内从0开始的索引,需要调整//left - left / size - 1, left=0会越界算出来=-1//避免出现长度为1的数组,一个数被加两次的情况,虽然此时sum3=0,但是sum1和sum2都会加一次if (b1 == b2) { // 区间 [left, right] 在同一块中int sum = 0;for (int j = i1; j <= i2; j++) {sum += nums[b1 * size + j];}return sum;}int sum1 = 0;for (int j = i1; j < size; j++) {//包括leftsum1 += nums[b1 * size + j];}int sum2 = 0;for (int j = 0; j <= i2; j++) {//包括rightsum2 += nums[b2 * size + j];}int sum3 = 0;for (int j = b1 + 1; j < b2; j++) {//b1和b2相等的时候sum3=0,从索引为b1+1的块到b2-1的块之和sum3 += sum[j];}return sum1 + sum2 + sum3;}
}

 

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

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

相关文章

DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac

一、说明 初学HarmonyOS开发&#xff0c;DevEco Studio开发工具的安装和使用是必须的。 &#xff08;注&#xff1a;不多废话&#xff0c;跟着下面流程操作下载、安装DevEco Studio即可。&#xff09; 二、下载DevEco Studio 1.官网下载地址&#xff1a; https://developer.…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月&#xff0c;中国广电成功获得5G牌照以来&#xff0c;迅速推进网络建设目标&#xff0c;成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源&#xff0c;具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…

数据复现-企业数字化转型与中国实体经济发展分析

数据简介&#xff1a;在当今快速发展的数字化时代&#xff0c;数字技术已经成为企业数字化转型的核心驱动力之一。尤其对于中国这样一个拥有庞大实体经济的国家而言&#xff0c;结合数字技术的应用&#xff0c;可以为企业带来前所未有的巨大机遇和挑战。在中国&#xff0c;实体…

5 Paimon数据湖之表数据查询详解

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html 虽然前面我们已经讲过如何查询Paimon表中的数据了&#xff0c;但是有一些细节的东西还需要详细分析一下。 首先是针对Paimon中系统表的查询&#xff0c;例如snapshots\schemas\options等等这些…

接口开放太麻烦?试试阿里云API网关吧

前言 我在多方合作时&#xff0c;系统间的交互是怎么做的&#xff1f;这篇文章中写过一些多方合作时接口的调用规则和例子&#xff0c;然而&#xff0c;接口开放所涉及的安全、权限、监控、流量控制等问题&#xff0c;可不是简简单单就可以解决的&#xff0c;这一般需要专业的…

ElasticSearch简单操作

目录 1.单机部署 1.1 解压软件 1.2 创建软链接 1.3 修改配置文件 1.4 配置环境变量 1.5 后台启动 2.配置分词器 2.1 安装IK分词器 2.2 ES 扩展词汇 3.常用操作 3.1 索引 3.1.1 创建索引 3.1.2 查看所有索引 3.1.3 查看单个索引 3.1.4 删除索引 3.2.文档 3.2.1…

@Async注解的坑

问题描述 一个方法调用另一个方法(该方法使用Async注解)在同一个类文件中&#xff0c;该注解会失效&#xff01; 问题复现 TestAsyncController 类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; im…

双十一大促已过,虾皮、Lazada年底如何通过测评补单打造搜索排名

双十一大促已过&#xff0c;有人欢喜有人忧&#xff0c;不管怎么样&#xff0c;年底的这波旺季还是要好好把握的。 如何提升虾皮搜索排名 1、标题关键词匹配度 Shopee、Lazada的排名规则主要是根据用户搜索时输入的关键字和卖家的商品标题、描述等是否相匹配来进行排名&…

P6入门:项目初始化7-项目详情之代码/分类码Code

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

qnx log 系统

前言 本文主要介绍QNX 系统中的 log 打印相关接口和使用方法 软件环境:qnx7.1 一、QNX查看 log 的工具 slog2info 1. slog2info 的相关介绍 和linux 中查看 kernel log 信息的 dmesg 命令一样, qnx 里面也有一个查看 log 信息的命令,那就是 slog2info 命令, 如下图所示是…

Spark SQL 每年的1月1日算当年的第一个自然周, 给出日期,计算是本年的第几周

一、问题 按每年的1月1日算当年的第一个自然周 (遇到跨年也不管&#xff0c;如果1月1日是周三&#xff0c;那么到1月5号&#xff08;周日&#xff09;算是本年的第一个自然周, 如果按周一是一周的第一天) 计算是本年的第几周&#xff0c;那么 spark sql 如何写 ? 二、分析 …

0基础学习PyFlink——水位线(watermark)触发计算

在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》和《0基础学习PyFlink——个数滑动窗口&#xff08;Sliding Count Windows&#xff09;》中&#xff0c;我们发现如果窗口中元素个数没有把窗口填满&#xff0c;则不会触发计算。 为了解决长期不计算的问题&a…