题目
假设有一个论坛,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间 (按时间顺序记录),
要求写一个算法统计一天中同时在线人数最多的时间段,日志文件如下所示:
[十进制unix时间戳] | [ID] | [事件类型]
1488881338 | abcdefghijk | 1
1488881338 | zyxwvutsu | 1
1488881501 | zyxwvutsu | -1
1488881622 | abcdefghijk | -1
其中,1表示登录,-1表示下线。
从上面的日志文件可看到1488881338~1488881501时间段,为最大在线人数时间段,且在线人数为2。
分析
根据日志的格式,我们按时间顺序把事件类型排序得到一个序列,找到一个和最大的子序列,
就表示在这个阶段上线人数-下线人数
最大,该阶段的和即为最大的在线人数。且从该子序列
的末尾R开始是最大在线人数的起始点,下一个记录R+1为结束点。
JS实现
1 | var arr = []; |
结果
1 | [ { ts: 1472701532, val: 1 }, |
可以看到这个最大的在线人数仅仅保持了”片刻”!