万万没想到之抓捕孔连顺

1:回溯法:超时

/**
 * className:test2
 * Package:PACKAGE_NAME
 *
 * @Author:swx
 * @Create2024/1/1020:57
 * @version:1.0
 */
import java.util.*;
public class test2 {
    static LinkedList<Integer> path = new LinkedList<>();
    static int result = 0;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num1 = scanner.nextInt(); // 建筑物的位置
        int num2 = scanner.nextInt(); // 两名特工相聚的最大距离

        int[] building = new int[num1];
        for (int i=0; i<num1; i++) {
            building[i] = scanner.nextInt();
        }
        Arrays.stream(building).sorted();
        backtracking(building, num2, 0);
        System.out.println(result);
    }

    private static void backtracking(int[] building, int num2, int startIndex) {
        if (path.size() == 3) {
            result+=1;
            return;
        }
        for (int i=startIndex; i<building.length; i++) {
            path.add(building[i]);
            if (path.peekLast() - path.peekFirst() <= num2) {
                backtracking(building, num2, i + 1);
                path.removeLast();
            }
            else
                path.removeLast();
        }
    }
}

2:快慢指针法:

import java.util.Scanner;

/**
 * @author guizimo
 * @date 2020/7/17 10:04 下午
 */
public class test_2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int d = scanner.nextInt();
            int[] position = new int[n];
            scanner.nextLine();
            for (int i = 0; i < n; i++) {
                position[i] = scanner.nextInt();
            }
            run(n, d, position);
        }
    }

    public static void run(int n, int d, int[] position) {
        long sum = 0L;
        long mod = 99997867;
        // 采用快慢指针 其中i为快至指针 j为慢指针
        for (int i = 0, j = 0; i < n; i++) {
            //从第三个开始判断,判断是否违法,如果违法j++
            while (i >= 2 && position[i] - position[j] > d) {
                j++;
            }
            //计算合法的次数,n(n-i)/2
            /*
            * 比如对于 1, 2, 3, 4这四个建筑 最大距离和最小距离不大于3
            * 当i=2,j=0。 此时只有一个情况就是(1,2,3).此时一个特工已经在第三个建筑了即i=2,另外两个特工从前2个任选2个不重复的就是C22
            * 当i=3,j=0时依然满足情况。此时一个特工已经在第三个建筑了即i=3,另外两个特工从前3个任选2个不重复的就是C32
            * 依次类推
            * */
            sum += (long) (i - j) * (long) (i - j - 1) / 2;
        }
        System.out.println(sum % mod);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值