万万没想到之抓捕孔连顺

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;
    }

放到牛客网上跑了跑,不给过,有个测试用例跑不过,显示我的结果输多了好多!我觉得我的方法应该不会造成重复结果才对啊!

我的办法说到底就是枚举开始结束位置,对于中间位置的选择我认为就是直接可选范围都是满足条件的。

 希望大佬留个言,帮帮我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值