算法:定义一个数组的的陡峭值为:相邻两个元素之差的绝对值之和。

news2025/7/14 3:45:19

定义一个数组的的陡峭值为:相邻两个元素之差的绝对值之和。现在小红拿到了一个数组,她有多次询问,每次查询一段连续子数组的陡峭值。你能帮帮她吗?
连续子数组为从原数组中,连续的选择一段元素(可以全选、可以不选)得到的新数组。
输入描述
第一行输入一个正整数n,代表数组长度。
第二行输入n个正整数ai,代表小红拿到的数组。
第三行输入一个正整数q,代表询问次数。
接下来的q行,每行输入两个正整数l,r代表一次询问.
1 ≤ n,q≤ 10^5,1 ≤ ai ≤ 10^9
1≤l≤r≤n
输出描述
输出q行,每行输出一个正整数,代表查询的结果
以上是一道算法题,请使用java代码实现,标准输入输出

以下是使用 Scanner 输入的 Java 代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        
        // 计算差值数组d
        int[] d = new int[n - 1];
        for (int i = 0; i < n - 1; i++) {
            d[i] = Math.abs(a[i + 1] - a[i]);
        }
        
        // 计算前缀和数组sum
        int[] sum = new int[n];
        for (int i = 1; i < n; i++) {
            sum[i] = sum[i - 1] + d[i - 1];
        }
        
        // 处理查询
        int q = scanner.nextInt();
        for (int i = 0; i < q; i++) {
            int l = scanner.nextInt();
            int r = scanner.nextInt();
            if (l == r) {
                System.out.println(0);
            } else {
                // 转换为0-based索引
                System.out.println(sum[r - 1] - sum[l - 1]);
            }
        }
        scanner.close();
    }
}

修改说明:

  1. 输入方式替换
    BufferedReader 替换为 Scanner,通过 scanner.nextInt() 直接读取整数。

  2. 数组读取
    使用循环逐个读取数组元素,避免 split 的字符串处理。

  3. 查询处理
    直接通过 scanner.nextInt() 读取 lr,无需额外处理字符串分割。


代码逻辑保持不变:

  1. 预处理差值数组:计算相邻元素的绝对差值。
  2. 前缀和数组:通过前缀和快速计算任意区间的陡峭值。
  3. 查询优化:每个查询的时间复杂度为 O(1),总时间复杂度为 O(n + q)。

输入输出示例:

输入

3
1 3 5
2
1 2
1 3

输出

2
4

解释:

  • 区间 [1,2] 的差值为 |3-1|=2
  • 区间 [1,3] 的差值为 |3-1| + |5-3| = 2 + 2 = 4

优化复杂度(建议将int全部换成long避免数据溢出)

以下是优化后的代码,通过减少数组的使用和避免溢出,同时保持内存效率:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }

        // 直接计算前缀和,省去差值数组d
        long[] sum = new long[n]; // 使用long防止溢出
        for (int i = 1; i < n; i++) {
            sum[i] = sum[i - 1] + Math.abs(a[i] - a[i - 1]);
        }

        int q = scanner.nextInt();
        for (int i = 0; i < q; i++) {
            int l = scanner.nextInt();
            int r = scanner.nextInt();
            if (l == r) {
                System.out.println(0);
            } else {
                // 转换为0-based索引
                System.out.println(sum[r - 1] - sum[l - 1]);
            }
        }
        scanner.close();
    }
}

优化说明:

  1. 省去差值数组 d

    • 直接在计算前缀和数组 sum 时,边计算差值边累加,不再需要单独的 d 数组,节省了 O(n) 的空间。
  2. 使用 long 类型的前缀和数组

    • 原差值可能达到 2e9,当 n=1e5 时,总和可能超过 int 的范围(最大值为 2^31-1≈2e9),因此必须使用 long 类型以避免溢出。
  3. 内存优化效果

    • 原方案需要存储 dint[n-1])和 sumint[n]),总空间为 4n(以字节计算)。
    • 新方案仅用 long[n]sum,空间为 8n,但通过省去 d 数组,总内存与原方案相近,同时避免了溢出问题。

复杂度分析:

  • 时间复杂度:预处理为 O(n),每个查询为 O(1),总时间复杂度仍为 O(n + q)
  • 空间复杂度O(n),仅需存储原始数组 a 和前缀和数组 sum

输入输出示例:

输入

3
1 3 5
2
1 2
1 3

输出

2
4

关键点总结:

  • 避免溢出:差值总和可能超过 int 的范围,必须使用 long
  • 减少数组:直接计算前缀和,无需额外存储差值数组,节省内存。
  • 高效查询:通过前缀和实现 O(1) 时间的区间查询。

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

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

相关文章

OpenTiny使用指南

最近项目里用到了一个新的组件库——OpenTiny&#xff0c;但是官方文档的使用指南的描述很复杂&#xff0c;花了一些时间尝试才正常使用。下面是一个使用步骤的描述&#xff0c;可放心食用&#xff1a; 一、安装 TinyVue 组件库同时支持 Vue 2.0 和 Vue 3.0 框架&#xff0c;…

KingbaseES之KDts迁移SQLServer

项目适配迁移SQLServer至金仓,今天写写KDts-WEB版迁移工具迁移SQLServer至KingbaseES的步骤,以及迁移注意事项. SQLServer版本:SQLServer2012 KingbaseES版本:V009R004C011(SQLServer兼容版) --1.进入数据库客户端工具KDTS工具目录&#xff0c;启动KDts服务&#xff1a; [king…

代码随想录动态规划part02

动态规划part02 62.不同路径 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 递归法 动态规划&#xff0c;当前状态是由上一个状态转化来的 这里初始化错误了&#xff0c;想法是对的右一和…

详解如何复现DeepSeek R1:从零开始利用Python构建

DeepSeek R1 的整个训练过程&#xff0c;说白了就是在其基础模型&#xff08;也就是 deepseek V3&#xff09;之上&#xff0c;用各种不同的强化学习方法来“雕琢”它。 咱们从一个小小的本地运行的基础模型开始&#xff0c;一边跟着 DeepSeek R1 技术报告 的步骤&#xff0c;…

Java集合框架 源码分析 迭代器 并发修改异常底层原理

迭代器 Java中的Iterator&#xff08;迭代器&#xff09;是集合框架中用于遍历容器元素的统一接口&#xff0c;提供了一种标准化的元素访问方式&#xff0c;无需依赖具体集合类型的实现细节。以下是其核心要点&#xff1a; 一、核心方法与使用步骤 获取迭代器 通过集合的 it…

Cannot find module ‘vue‘ or its corresponding type declarations

在使用vue3vite创建新的工程时&#xff0c;在新增.vue文件时会出现Cannot find module vue这个错误。 只需要我们在项目中的.d.ts文件中添加以下代码即可 declare module *.vue {import { defineComponent } from vue;const component: ReturnType<typeof defineComponent&…

【Python爬虫】详细工作流程以及组成部分

目录 一、Python爬虫的详细工作流程 确定起始网页 发送 HTTP 请求 解析 HTML 处理数据 跟踪链接 递归抓取 存储数据 二、Python爬虫的组成部分 请求模块 解析模块 数据处理模块 存储模块 调度模块 反爬虫处理模块 一、Python爬虫的详细工作流程 在进行网络爬虫工…

欧拉服务器操作系统部署deekseep(Ollama+DeekSeep+open WebUI)

​​一、解压并安装 Ollama​​ # 1. 解压文件&#xff08;默认会得到一个二进制文件&#xff09; tar -xzvf ollama-linux-amd64.tgz# 2. 将二进制文件安装到系统路径 sudo mv ollama /usr/local/bin/ sudo chmod x /usr/local/bin/ollama# 3. 验证安装 ollama --version链接…

#4 我们为什么使用物联网? 以及 物联网的整体结构

设备不物联是否可以&#xff1f; 答案 是可以的&#xff0c;从项目实战的角度&#xff0c;还是有很多包括分拣&#xff0c;控制&#xff0c;检测等应用是分立的&#xff0c;这个和成本&#xff0c;场景&#xff0c;客户接受度等因素有关。 局部看&#xff0c;一些系统的确很简…

3D版的VLA——从3D VLA、SpatialVLA到PointVLA(不动VLM,仅动作专家中加入3D数据)

前言 之前写这篇文章的时候&#xff0c;就想解读下3D VLA来着&#xff0c;但一直因为和团队并行开发具身项目&#xff0c;很多解读被各种延后 更是各种出差&#xff0c;比如从25年3月下旬至今&#xff0c;连续出差三轮&#xff0c;绕中国半圈&#xff0c;具身占八成 第一轮 …

linux Shell编程之循环语句(三)

目录 一. for 循环语句 1. for语句的结构 2. for 语句应用示例 (1) 根据姓名列表批量添加用户 (2) 根据 IP 地址列表检查主机状态 二. 使用 while 循环语句 1. while 语句的结构 2. while 语句应用示例 (1) 批量添加规律编号的用户 (2) 猜价格游戏 三. until 循环语…

C#容器源码分析 --- Queue<T>

Queue<T> 是 System.Collections.Generic 命名空间下的先进先出&#xff08;FIFO&#xff09;动态集合&#xff0c;其核心实现基于​​循环数组​​&#xff0c;通过维护头尾指针实现高效入队和出队操作。 .Net4.8 Queue<T>源码地址&#xff1a;queue.cs (microso…

ViT 模型讲解

文章目录 一、模型的诞生背景1.1 背景1.2 ViT 的提出&#xff08;2020年&#xff09; 二、模型架构2.1 patch2.2 模型结构2.2.1 数据 shape 变化2.2.2 代码示例2.2.3 模型结构图 2.3 关于空间信息 三、实验3.1 主要实验3.2 消融实验 四、先验问题4.1 归纳偏置4.2 先验or大数据&…

IntelliJ IDEA 中安装和使用通义灵码 AI 编程助手教程

随着人工智能技术的发展&#xff0c;AI 编程助手逐渐成为提升开发效率的强大工具。通义灵码是阿里云推出的一款 AI 编程助手&#xff0c;它能够帮助开发者实现智能代码补全、代码解释、生成单元测试等功能&#xff0c;极大地提升了编程效率和代码质量。 IntelliJ IDEA 是一款广…

FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)

裸机程序设计模式 裸机程序的设计模式可以分为&#xff1a;轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题&#xff1a;假设有A、B两个都很耗时的函数&#xff0c;无法降低它们相互之间的影响。第4种方法可以解决这个问题&#xff0c;但是实践起来有难…

can‘t set boot order in virtualbox

Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾选EFI boot order就是灰色的 传统BIOS就是可选的 然后选中任意介质&#xff0c;通过右边的上下箭头调节顺序&#xff0c;最上面的应该是优先级最高的 然后就…

2025年第十六届蓝桥杯省赛C++ A组真题

2025年第十六届蓝桥杯省赛C A组真题 1.说明2.题目A&#xff1a;寻找质数&#xff08;5分&#xff09;3.题目B&#xff1a;黑白棋&#xff08;5分&#xff09;4. 题目C&#xff1a;抽奖&#xff08;10分&#xff09;5. 题目D&#xff1a;红黑树&#xff08;10分&#xff09;6. 题…

asp.net Kestrel 和iis区别

Kestrel 和 IIS 都是用于托管 Web 应用程序的服务器&#xff0c;不过它们在多个方面存在显著差异&#xff0c;下面为你详细分析&#xff1a; 1. 所属平台与跨平台能力 Kestrel&#xff1a;是.NET Core 及后续版本的一部分&#xff0c;具备跨平台特性&#xff0c;可在 Windows…

《植物大战僵尸融合版v2.4.1》,塔防与创新融合的完美碰撞

《植物大战僵尸融合版》是基于经典塔防游戏《植物大战僵尸》的创意同人改版&#xff0c;由“蓝飘飘fly”等开发者主导制作。它在保留原版核心玩法的基础上&#xff0c;引入了独特的植物融合机制&#xff0c;玩家可以将不同的植物进行组合&#xff0c;创造出全新的植物种类&…

[LeetCode 1696] 跳跃游戏 6(Ⅵ)

题面&#xff1a; LeetCode 1696 数据范围&#xff1a; 1 ≤ n u m s . l e n g t h , k ≤ 1 0 5 1 \le nums.length, \ k \le 10^5 1≤nums.length, k≤105 − 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10^4 \le nums[i] \le 10^4 −104≤nums[i]≤104 思路 & Code 重点&…