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

news/2024/7/5 9:30:57

暴力解法

创建方法,通过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");//根据题意返回null

        for (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":
                    //方法不返回,根据题意输出null
                    numArray.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++) {//包括left
            sum1 += nums[b1 * size + j];
        }
        int sum2 = 0;
        for (int j = 0; j <= i2; j++) {//包括right
            sum2 += 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://lihuaxi.xjx100.cn/news/1786836.html

相关文章

【算法】算法题-20231114

这里写目录标题 一、LCR 181. 字符串中的单词反转二、557. 反转字符串中的单词 III三、344. 反转字符串四、给定一个已按照升序排列的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。五、力扣第49题&#xff1a;字母异位词分组 一、LCR 181. 字符串中的单词反转 …

java学习part02一些特性

17-Java语言概述-Java语言的特点和JVM的功能_哔哩哔哩_bilibili 1.java优点 跨平台性 在jvm上运行 2.jvm 2.1实现跨平台性 不需要对每一种指令集编写编译器&#xff0c;只需要针对jvm编程&#xff0c;jvm会自动转换 2.2内存回收 内存溢出&#xff1a;用的内存太多已经占满了&…

NLP---文本前期预处理的几个步骤

1、读取文本 text1 """ Football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal. Unqualified, the word football is understood to refer to whichever form of football is the most popular in the reg…

P6入门:项目初始化9-项目详情之资源 Resource

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

【C语言】深入解开指针(二)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心的勇气和无限的潜能&#xff0c;只要你有决心&#xff0c;就没有什么事情是不可能的…

Springboot细节补充

一、Bean是怎么装配的&#xff1f; 1、bean扫描 在之前的ssm中&#xff0c;spring要么用标签的形式来扫描包&#xff0c;要么使用注解ComponentScan来扫描 但是在Springboot中&#xff0c;启动类上默认有一个注解SpringBootApplication&#xff0c;里面就包含了ComponentScan…

警告:新版Outlook会向微软发送密码、邮件和其他数据

新的免费Outlook会将敏感数据发送给 Microsoft。 在没有通知或询问的情况下&#xff0c;Microsoft 授予自己对新 Outlook 用户的 IMAP 和 SMTP 访问数据的完全访问权限。也就是说&#xff0c;当用户设置 IMAP 帐户时&#xff0c;新的 Outlook 会将访问数据和服务器信息发送给 …

探索STM32系列微控制器的特性和性能

STM32系列微控制器是意法半导体&#xff08;STMicroelectronics&#xff09;公司开发的一款强大的嵌入式微控制器系列。该系列微控制器以其丰富的特性和卓越的性能&#xff0c;成为了嵌入式系统开发领域的首选。本文将深入探索STM32系列微控制器的特性和性能&#xff0c;并结合…