问题描述:
给定三个整数数组
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);
}
}