1. 我们在字节跳动大街的 N 个建筑中选定 3 个埋伏地点。
2. 为了相互照应,我们决定相距最远的两名特工间的距离不超过 D 。
给定 N(可选作为埋伏点的建筑物数)、 D(相距最远的两名特工间的距离的最大值)以及可选建筑的坐标,计算在这次行动中,大锤的小队有多少种埋伏选择。
注意:
1. 两个特工不能埋伏在同一地点
2. 三个特工是等价的:即同样的位置组合( A , B , C ) 只算一种埋伏方法,不能因“特工之间互换位置”而重复使用。
数据范围: 0<n,d≤10^6
按照题意,利用数据arr 装大楼之间的距离数据,首先从左往右寻找满足最大距离范围的第三名特工位置,并且固定第一名特工位置就是第一个位置,遇到第一个不满足条件就退出循环(从大到大排序);确定了第一名第三名特工位置之后,只需要插入第二名特工即可,首尾位置确定,第二名则只有 (结尾位置 - 初始位置) 个位置可以选择,这样子得到了第一轮的筛选结果;
第二轮,确定最后结尾位置(数组的最后一个元素)为第三名特工,第一名特工从起始位置开始枚举,同理中间位置就是第二名特工位置;
按我这种办法有什么缺漏之处吗?有大佬指教一二,感谢!!!
// arr 距离数组
// d 最大距离
private static int findSite(int[] arr, int d){
int i = 0, j = 2;
int n = arr.length;
int result = 0;
while(j < n && (arr[j] - arr[i] <= d)){
result += (j - i - 1);
System.out.printf("i = %s, j= %s %n", i, j);
j++;
}
j = n - 1;
i = 1;
while(i < j){
if(arr[j] - arr[i] <= d){
result += (j - i - 1);
System.out.printf("i = %s, j= %s %n", i, j);
}
i++;
}
return result;
}
放到牛客网上跑了跑,不给过,有个测试用例跑不过,显示我的结果输多了好多!我觉得我的方法应该不会造成重复结果才对啊!
我的办法说到底就是枚举开始结束位置,对于中间位置的选择我认为就是直接可选范围都是满足条件的。
希望大佬留个言,帮帮我!