备战蓝桥杯————差分数组1

引言

一、差分数组

        什么是差分数组

        差分数组的作用

        Java代码实现差分数组

二、 区间加法 

        题目描述

        代码与解题思路

总结

引言

        在数字世界的海洋中,数据是构建和优化算法的基石。然而,当我们面对需要频繁进行区间操作的数组时,传统的逐元素处理方法往往会成为效率的瓶颈。想象一下,你手中有一张复杂的数据地图,需要在短时间内对特定区域进行多次修改,而每一次修改都可能引发连锁反应。在这种情况下,一种名为“差分数组”的算法技巧就像是一把瑞士军刀,它不仅能够简化操作,还能大幅提升处理速度。本文将带你深入了解差分数组的魔力,以及它是如何在算法的世界里大放异彩的。

一、差分数组

什么是差分数组

        差分数组是一种高效的算法技巧,它在处理数组区间操作时特别有用。当你需要频繁地对数组的某个区间进行元素的增减操作时,使用差分数组可以显著提高效率。这种方法的核心思想是利用差分来避免对整个区间进行逐个元素的修改。

差分数组的作用

        在差分数组中,每个元素 delta[i]表示从 original[i-1] 到 original[i]的变化量。通过这种方式,我们可以在 O(1) 时间内完成对任意区间的增减操作,而不是逐个元素地进行 O(N) 时间复杂度的修改。

        例如,如果我们想要对区间 original[i..j]的元素全部加上一个值 value,我们只需要执行以下两个操作:

        1. delta[i] += value:增加区间起始位置的差分。
        2. delta[j + 1] -= value:减少区间结束位置的下一个位置的差分,以保持差分数组的正确性。

        通过这种方式,我们可以随时快速地更新差分数组,并在需要时通过累加差分数组来重构原始数组。这种方法在处理大量区间操作的问题时,如动态数组、区间求和、区间更新等,尤其有用。在实际应用中,我们首先根据原始数组 original 构造差分数组 delta。然后,对于任何区间操作,我们只需要对差分数组进行相应的增减。最后,我们可以通过累加差分数组来得到操作后的原始数组 resultArray。

Java代码实现差分数组

// 差分数组工具类
class DeltaArray {// 差分数组private int[] delta;/* 输入一个初始数组,区间操作将在这个数组上进行 */public DeltaArray(int[] original) {assert original.length > 0;delta = new int[original.length];// 根据初始数组构造差分数组delta[0] = original[0];for (int index = 1; index < original.length; index++) {delta[index] = original[index] - original[index - 1];}}/* 给闭区间 [start, end] 增加 value(可以是负数)*/public void modify(int start, int end, int value) {delta[start] += value;if (end + 1 < delta.length) {delta[end + 1] -= value;}}/* 返回结果数组 */public int[] getResult() {int[] resultArray = new int[delta.length];// 根据差分数组构造结果数组resultArray[0] = delta[0];for (int i = 1; i < delta.length; i++) {resultArray[i] = resultArray[i - 1] + delta[i];}return resultArray;}
}

二、 区间加法 

题目描述

        假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k​​​​​​ 个更新的操作。其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组 A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加 inc。请你返回 k 次操作后的数组。

示例:

输入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]]
输出: [-2,0,3,5,3]

解释:

初始状态:
[0,0,0,0,0]进行了操作 [1,3,2] 后的状态:
[0,2,2,2,0]进行了操作 [2,4,3] 后的状态:
[0,2,5,5,3]进行了操作 [0,2,-2] 后的状态:
[-2,0,3,5,3]

代码与解题思路

        这道题直接使用刚才构建的差分类即可。

​
// 差分数组工具类
class DeltaArray {// 差分数组private int[] delta;/* 输入一个初始数组,区间操作将在这个数组上进行 */public DeltaArray(int[] original) {assert original.length > 0;delta = new int[original.length];// 根据初始数组构造差分数组delta[0] = original[0];for (int index = 1; index < original.length; index++) {delta[index] = original[index] - original[index - 1];}}/* 给闭区间 [start, end] 增加 value(可以是负数)*/public void modify(int start, int end, int value) {delta[start] += value;if (end + 1 < delta.length) {delta[end + 1] -= value;}}/* 返回结果数组 */public int[] getResult() {int[] resultArray = new int[delta.length];// 根据差分数组构造结果数组resultArray[0] = delta[0];for (int i = 1; i < delta.length; i++) {resultArray[i] = resultArray[i - 1] + delta[i];}return resultArray;}int[] getModifiedArray(int length, int[][] updates) {// nums 初始化为全 0int[] nums = new int[length];// 构造差分解法Difference df = new Difference(nums);for (int[] update : updates) {int i = update[0];int j = update[1];int val = update[2];df.increment(i, j, val);}return df.result();}
}​

总结

        通过本文的探讨,我们不仅揭开了差分数组的神秘面纱,还见证了它在解决实际问题中的强大力量。差分数组不仅是一种高效的算法技巧,更是一种思维方式的转变。它教会我们在面对复杂问题时,如何通过巧妙的数据结构和算法优化,将问题化繁为简。在这个数据驱动的时代,掌握差分数组这样的工具,无疑将为你的编程技能库增添一把锋利的剑。无论你是算法竞赛的选手,还是日常开发中的工程师,差分数组都将是你解决问题的得力助手。让我们继续探索算法的无限可能,用智慧的光芒照亮编程的道路。

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

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

相关文章

ABAP - SALV教程10 添加可编辑checkbox列

几乎所有的功能报表都会有那么一个选择列&#xff0c;问了业务顾问&#xff0c;业务顾问说是用户不习惯使用报表原生的选择模式。效果图SALV的选择列是通过将列设置成checkbox_hotspot样式&#xff0c;注册单击事件完成勾选功能的。完成步骤 将SEL列设置成checkbox_hotspot样式…

【笔记】OpenHarmony和HarmonyOS区别及应用开发简介

一、概念 OpenHarmony(OH) &#xff1a; OpenAtom OpenHarmonyHarmonyOS(HO)&#xff1a;开发 | 华为开发者联盟 (huawei.com) HO当前最高是3.1&#xff0c;在华为mate 60上面也是。关于4.0、5.0和next这类版本说法都是面向用户的&#xff0c;不是开发人员。对于程序员&#…

Springboot 项目读取yaml的配置文件信息给静态方法使用,以及通过配置 ResourceBundle 类读取config.properties

读取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 创建一个类 ProxyProperties 读取配置文件信息&#xff0c;并对外提供get方法 …

内存的检测与排查

内存&#x1f40e;的检测与排查 文章目录 内存&#x1f40e;的检测与排查查杀Java Web filter型内存马0x01 内存马简历史0x02 查杀思路0x03 内存马的识别0x04 内存马的查杀 查杀Java Web filter型内存马 0x01 内存马简历史 其实内存马由来已久&#xff0c;早在17年n1nty师傅的…

QT6 libModbus 用于ModbusTcp客户端读写服务端

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能&#xff0c;也可移植到各种平台。 性能&#xff1a;读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针&#xff0c;用于读100个寄存器和写100个寄存器&#xff0c;读写分离。 客户端&am…

物联网与智慧城市:科技驱动下的城市智能化升级之路

一、引言 随着科技的不断进步和城市化进程的加速&#xff0c;物联网与智慧城市的结合已经成为推动城市智能化升级的关键力量。物联网技术以其强大的连接和数据处理能力&#xff0c;为智慧城市的建设提供了无限可能。本文旨在探讨物联网如何助力智慧城市的构建&#xff0c;以及…

SLAM ORB-SLAM2(21)基础矩阵的计算和评分

SLAM ORB-SLAM2&#xff08;21&#xff09;基础矩阵的计算和评分 1. 前言2. 基础矩阵2.1. 对级约束2.2. 推导2.3. 计算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2&#xff08;20&#xff09;查找基础矩阵》 中了解到 查找基础矩阵主要过程&#xff1…

web基础03-JavaScript

目录 一、JavaScript基础 1.变量 2.输出 3.变量提升 4.区块 5.JavaScript数据类型 6.查看数值类型 7.undefined和null 8.布尔值 9.和的区别 10.算数/三元/比较/逻辑/赋值运算符 11.特殊字符 12.字符串 &#xff08;1&#xff09;获取字符串长度 &#xff08;2&am…

备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块 在python中&#xff0c;堆排序已经设置好了内置模块&#xff0c;不想自己写的话可以使用内置模块&#xff0c;真的很方便&#xff0c;但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。 使用heapq模块的heapify()函数将列表转换为堆&#xff0c;然后使用he…

41、网络编程/TCP.UDP通信模型练习20240301

一、编写基于TCP的客户端实现以下功能&#xff1a; 通过键盘按键控制机械臂&#xff1a;w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 1.基于TCP服务器的机械臂…

Java 创建对象有哪几种方式

1. 使用new关键字&#xff1a;这是最常见和最简单的创建对象的方式。你可以通过这种方式调用任意的构造函数&#xff0c;无论是无参的还是有参数的构造函数。 例如&#xff1a; Student stu new Student 2. 使用Class类的newInstance方法&#xff08;反射&#xff09; 这种…

Python3零基础教程之数学运算专题进阶

大家好,我是千与编程,今天已经进入我们Python3的零基础教程的第十节之数学运算专题进阶。上一次的数学运算中我们介绍了简单的基础四则运算,加减乘除运算。当涉及到数学运算的 Python 3 刷题使用时,进阶课程包含了许多重要的概念和技巧。下面是一个简单的教程,涵盖了一些常…

勒索软件类型

勒索软件类型 加密勒索软件 它使个人文件和文件夹&#xff08;文档、电子表格、图片和视频&#xff09;被加密。受感染的文件被加密后会被删除&#xff0c;用户通常会在当下无法使用的文件的文件夹中看到一个包含付款说明的文本文件。当您尝试打开其中一个加密文件时,您才可能…

Tomcat负载均衡、动静分离

目录 引言 实验图解 1.实验环境搭建 2.部署Nginx服务器及配置静态页面Web服务 3.部署Tomcat服务及配置动态页面Web服务 4.实验验收 动态页面 静态页面 引言 tomcat服务既可以处理动态页面&#xff0c;也可以处理静态页面&#xff1b;但其处理静态页面的速度远远不如…

Oracle SQL优化概念之集群因子解析

导读 本文介绍一个Oracle 数据库SQL优化的一个基本概念【集群因子】&#xff0c;理解了此概念&#xff0c;有助于对Oracle数据库进行SQL优化。 1. 集群因子名词解析 集群因子&#xff08;ClusteringFactor&#xff09;是如果通过一个索引扫描一张表&#xff0c;需要访问的表的数…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

【Vue3】解锁Vue3黑科技:探索接口、泛型和自定义类型的前端奇迹

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Android Compose - PlainTooltipBox(已废弃)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

跨站脚本攻击xss-labs(1-20)靶机练手

目录 一、跨站脚本攻击&#xff08;XSS&#xff09; 1.1 漏洞简介 1.2:类型 1.3 XSS危害 1.4XSS防御规则 二、环境搭建 三、xsst通关记录 Level 1&#xff1a;文本解析为 HTML Level 2&#xff1a;htmlspecialchars;input 标签 value 注入 定义和用法 字符过滤绕过 …