快捷搜索:  汽车  科技

不同数组标准差(差分数组--超简单但是很有用)

不同数组标准差(差分数组--超简单但是很有用)当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。给你一些日程安排 [start end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。MyCalendarThree() 初始化对象。int book(int start int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。提示:0 <= start < end <= 10^9每个测试用例,调用 book 函数最多不超过 400次题目描述试想一个场景,我们需要将位置0~8的数值都加上一个相同的数值,如果在原数组上操作,我们需要更改9个位置的值,但是我们在差分数组的位置上操作,我们只需要更改两个位置的值,即位

前言

昨天(2022-06-07)在做leetcode每日一题的时候,第一次看到了这个超级简单但是很实用的算法---差分数组,差分数组是由原数组进化而来,值为原数组当前位置值减去上一个位置的值,看下面这个图片就很清楚了。

不同数组标准差(差分数组--超简单但是很有用)(1)

从上图中我们可以很清晰的看到,diffArray[1]=-3=srcArray[1]-srcArray[0]=-1-2,那么当我们在已知差分数组的情况下,如何推出原数组,同样依据上面的关系,但是我们需要从index=0,依次将当前差分数组与原数组的上一个值进行累加。

应用场景

试想一个场景,我们需要将位置0~8的数值都加上一个相同的数值,如果在原数组上操作,我们需要更改9个位置的值,但是我们在差分数组的位置上操作,我们只需要更改两个位置的值,即位置0和8分别加上值,我们通过差分数组就能得到位置0~8之间的其他位置的正确值。

不同数组标准差(差分数组--超简单但是很有用)(2)

这种方式在一次性更新大量数据时候性能提升更加明显。

Leetcode题目实战

题目描述

当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。给你一些日程安排 [start end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。MyCalendarThree() 初始化对象。int book(int start int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。提示:0 <= start < end <= 10^9每个测试用例,调用 book 函数最多不超过 400次

思路

在上面的题目描述中,如果时间点有重合,这个时间点预定次数 1,最容易想到的就是暴力解法,每个时间点出现就将该时间点预定次数 1,但是看看数据量,最大值10^9,如果只有一个时间段[0-10^9],那我们在时间和空间上都损失了不少。这时候我们就可以使用上面所说的差分数组,仅仅更新开始时间和结束时间,然后进行计算。我们可以使用一个map存储差分数组更改的最终结果(差分数组开始时值全为0),key为开始时间或者结束时间点,value为预定次数,当出现一个日程[start end),我们需要将start位置预定次数 1,而因为是开区间,end并不包含在此次日程中,相当于在原数组中end-1位置的值 1,但是end位置的值没变,所以差分数组中end位置的值需要-1。接下来看看具体实现代码

代码

TreeMap<Integer Integer> treeMap; public MyCalendarThree() { treeMap = new TreeMap<>(); } public int book(int start int end) { if (!treeMap.containsKey(start)) { treeMap.put(start 0); } if (!treeMap.containsKey(end)) { treeMap.put(end 0); } treeMap.put(start treeMap.get(start) 1); treeMap.put(end treeMap.get(end) - 1); //x1 - 0 = value1 x2 - x1 = value2 int answer = 0; int max = 0; for (Integer value : treeMap.values()) { max = value; answer = Math.max(max answer); } return answer; }

最后

包括之前所有源代码都已上传至github:数据结构与算法

猜您喜欢: