1. 输入描述
第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)
第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0, 1000000])表示,从小到大排列(将字节跳动大街看做一条数轴)
2. 输出描述
不同埋伏方案的数量对 99997867 取模的结果,埋伏方案满足以下条件:
- 我们在字节跳动大街的N个建筑中选定3个埋伏地点
- 为了相互照应,我们决定相距最远的两名特工间的距离不超过D
- 三个特工是等价的:即同样的位置组合(A, B, C) 只算一种埋伏方法,不能因“特工之间互换位置”而重复使用
3. 思路描述
因为所给建筑物位置已经从小到大进行排序,因此可以划定一个区间范围,该区间范围内坐标最小的建筑与坐标最大的建筑之间的距离小于D,则区间范围中的任意三个建筑都满足最远距离小于D。
所以可以先找出范围,然后在其中求出三个建筑的组合数,这种方法的时间复杂度为O(n3),尝试发现当所给输入过多时超出题目时间限制。
为了减少程序的时间复杂度,建立在从小到大选择最大坐标建筑物的基础上,我们可以先确定最大坐标的建筑物后,再从小到大确定与该最大坐标建筑物匹配的、坐标最小的满足条件的最小坐标的建筑物,即依次确定一个又一个范围,在该范围中求出两个个建筑的组合数,累加后即可得到结果。
下图为代码逻辑: