蓝桥杯 历届试题 递增三元组

该博客介绍了一个算法问题,涉及统计满足特定条件的三元组(i, j, k)的数量。给定三个整数数组A、B、C,需要找出所有满足Ai<Bj<Ck的组合。解决方案是首先对这三个数组进行排序,然后遍历B数组,计算小于当前B[i]的A数组元素个数和大于B[i]的C数组元素个数,将这两个计数相乘累加到结果中。这种方法有效地减少了遍历的复杂性。
摘要由CSDN通过智能技术生成

问题描述:

给定三个整数数组
A=[A1,A2,…AN],
B=[B1,B2,…BN],
C=[C1,C2,…CN],
请你统计有多少个三元组 (i,j,k) 满足:
1≤i,j,k≤N
Ai<Bj<Ck

输入格式:

输入格式
第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,…AN。
第三行包含 N 个整数 B1,B2,…BN。
第四行包含 N 个整数 C1,C2,…CN。

思路:

由于A数组要比B数组小,B数组要比C数组小,所以对A,B,C数组进行排序,对排完序后的数组B进行循环,找出A中小于B[i]的元素的个数,找出C中大于B[i]的个数,然后将成绩加在最后的答案中即可.

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] A = new int[n];
        int[] B = new int[n];
        int[] C = new int[n];
        for (int i = 0; i < n; i++) {
            A[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            B[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            C[i] = sc.nextInt();
        }
        Arrays.sort(A);
        Arrays.sort(B);
        Arrays.sort(C);
        long res = 0;
        int l1 = 0, l2 = 0;
        //这里将l1和l2没有定义在for循环中,主要是因为A,B,C数组都进行了排序
        for (int i = 0; i < B.length; i++) {
        	//l1在上一次的排序中大于或等于B[i],因为b[i+1]大于等于b[i],所以A[l1]可能小于等于B[i+1],减少遍历的次数
            while (l1 < n && A[l1] < B[i]) {
                l1++;
            }
            while (l2 < n && C[l2] <= B[i]) {
                l2++;
            }
            res += (long)l1 * (n - l2);
        }
        System.out.println(res);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值