解题思路
本题的核心问题是:数据流中的点按到达顺序依次处理,对于每个到达的数据点,需要在已经到达的数据点中,找到时间戳落在 [current_timestamp - interval, current_timestamp] 内的最大测量值。
关键观察:
- 数据是乱序到达的——到达顺序与时间戳顺序不一定一致。因此,对于当前处理的数据点
(t_i, v_i),之前可能已经到达了时间戳大于 t_i 的点(属于"未来"),这些点不在追溯窗口内,需要排除。
- 窗口的上界是
t_i(只能回溯到当前时间戳及之前),下界是 t_i - interval。
算法思路:
题目内容
在工业物联网监控系统中,由于网络抖动、边缘节点缓存重发等原因,传感器上报数据往往是乱序到达;
系统接收到一段数据流数据,流中的每个数据包包含一个发生时刻(单位秒)的时间戳和一个测量值;
对于流中到达的每一个数据点,系统需要以该数据点的时间戳为基准,回溯过去一段时间内(包含当前时间戳),数据点的最大测量值是多少;
请设计一段程序,按数据流 data 中各点的到达顺序,依次输出每个点对应回溯区间中的最大测量值。
输入描述
数据流 data:二维数组格式,每个数组元素包括两个参数,发生时刻和该时刻的测量值;如 [1,10] 表示时刻 1 的测量值为 10;
回溯时间 interval:整型格式,如当前时刻为 1,回溯时间为 5,那么表示回溯时间起点为 −4,回溯区间为 [−4,1];
输出描述
每个时刻对应回溯区间的最大测量值组成的数组;
约束条件
1≤interval≤1091≤data.length≤103−109≤value≤109
样例1
输入
[[1,10],[6,12],[3,5],[10,7],[5,8]],4
输出
[10,12,10,12,10]
说明
- 第 1 个到达 [1,10]:时间基准为 1,窗口为 [−3,1]。此时系统只有该点,最大值 =10。
- 第 2 个到达 [6,12]:时间基准为 6,窗口为 [2,6]。系统已有 [1:10,6:12],落在 [2,6] 内的只有 12,最大值 =12。
- 第 3 个到达 [3,5]:时间基准为 3,窗口为 [−1,3]。系统已有 [1:10,6:12,3:5],落在 [−1,3] 内的有 10 和 5(注意:时刻 6 在时刻 3 的未来,不属于过去 4 秒),最大值 =max(10,5)=10。
- 第 4 个到达 [10,7]:时间基准为 10,窗口为 [6,10]。系统已有 [1:10,6:12,3:5,10:7],落在 [6,10] 内的有 12 和 7,最大值 =12。
- 第 5 个到达 [5,8]:时间基准为 5,窗口为 [1,5]。系统已有上述全部点,落在 [1,5] 内的有 10,5,8,最大值 =10。
样例2
输入
[[100,50],[95,80],[105,20]],10
输出
[50,80,80]
说明
- 到达 [100,50]:窗口 [90,100],最大值 50。
- 到达 [95,80]:窗口 [85,95],只有 80,最大值 80。
- 到达 [105,20]:窗口 [95,105],包含已到达的 (95:80,100:50,105:20),最大值 80。