【差分数组】还不懂差分数组?蓝桥杯算法模板题小明的彩灯解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 文章目录1.算法背景2.差分数组2.1 什么是差分数组?2.2 差分数组的性质3 例题——小明的彩灯3.1 题目分析3.2 参考代码(Java)3.3 实现结果

1.算法背景

✈️试想一下,你有一个长度为100万的数组,这时候,你需要修改索引区间[1,100000]的值,我们很容易想到通过循环遍历数组来修改值。但是如果这种操作是频繁的呢?你就需要频繁的遍历数组进行修改,而这个修改区间又比较大,因此,时间复杂度极高。为了使这种操作更加高效,差分数组便出现了。


2.差分数组

2.1 什么是差分数组?

🐜我们给定一个数组nums = [1, 2, 3, 4, 5, 6],为了便于计算,我们从索引1处开始赋值,索引0处默认为0。此时nums = [0, 1, 2, 3, 4, 5, 6]。

记nums的差分数组为array,则有array[ i ] = nums[ i ] - nums [ i-1 ],求得差分数组array = [0, 1, 1, 1, 1, 1, 1]。

2.2 差分数组的性质

🥇对差分数组求前缀和即可得到原来的数组

对于上述数组,有nums[1] = array[0] + array[1];nums[2] = array[0] + array[1] + array[2];即有:

🌟nums[ index ] = ∑ i = 0 i n d e x a r r a y [ i ] \sum_{i=0}^{index} array[ i ]∑

i=0

index

array[i]


🥈若需要将原数组区间[l, r]的数字+X,则修改后的数组的新差分数组满足array_1[l] += X; array_1[r+1] -= X;其余的差分数组值保持不变


3 例题——小明的彩灯

🍎题目链接:小明的彩灯

超链接若异常请手动复制访问:https://www.lanqiao.cn/problems/1276/learning/


【题目描述】

小明拥有 N个彩灯,第 i个彩灯的初始亮度为 a_i 小明将进行 Q次操作,每次操作可选择一段区间,并使区间内彩灯的亮度+x(x 可能为负数)。求 Q次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 0)。

【输入描述】

第一行包含两个正整数 N,Q,分别表示彩灯的数量和操作的次数。

第二行包含 N 个整数,表示彩灯的初始亮度。

接下来 Q 行每行包含一个操作,格式如下:

l r x,表示将区间 l∼r 的彩灯的亮度 +x。

【输出描述】

输出共 1 行,包含 N 个整数,表示每个彩灯的亮度。

【输入样例】

5 3

2 2 2 1 5

1 3 3

4 5 5

1 1 -100

【输出样例】

0 5 5 6 10


3.1 题目分析

定义array为nums的差分数组,将对nums数组的操作转化为对array数组的操作,后将前缀和记录到res数组中保存结果(注意灯的亮度不能小于0),最终输出结果即可。


3.2 参考代码(Java)

import java.util.Scanner;
public class test17 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();  // 数字数
        int Q = in.nextInt();  // 操作次数
        int[] nums = new int[N+1];  // 数字输入
        int[] array = new int[N+2]; // 差分数组
        int[] res = new int[N+1];  // 记录结果
        for (int i = 1; i <= N; i++) {
            nums[i] = in.nextInt();
        }
        for (int i = 1; i <= N; i++) {
            array[i] = nums[i] - nums[i-1];
        }
        // 操作
        while (Q-- != 0){
            int l = in.nextInt();  // 左区间
            int r = in.nextInt();  // 右区间
            int x = in.nextInt();
            array[l] += x;
            array[r+1] -= x;
        }
        // 计数前缀和
        res[1] = array[1];
        for (int i = 2; i <= N ; i++) {
            res[i] = res[i-1] + array[i];
        }
        // 打印结果 控制输出格式
        for (int i = 1; i <= N; i++) {
            if(res[i] >= 0){
                if(i == N)
                    System.out.print(res[i]);
                else
                    System.out.print(res[i] + " ");
            }else {
                if(i == N)
                    System.out.print("0");
                else
                    System.out.print("0 ");
            }
        }
        in.close();
    }
}

3.3 实现结果

相关文章
|
3月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
56 0
|
3月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
61 3
|
3月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
3天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
28天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
150 30
|
7天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
1月前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
260 15
|
3月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
2月前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
88 3
|
2月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
75 4

推荐镜像

更多