给定三个整数数组
A = [A1, A2, ... AN],
B = [B1, B2, ... BN],
C = [C1, C2, ... CN],
请你统计有多少个三元组(i, j, k) 满足:
1. 1 <= i, j, k <= N
2. Ai < Bj < Ck
【输入格式】
第一行包含一个整数N。
第二行包含N个整数A1, A2, ... AN。
第三行包含N个整数B1, B2, ... BN。
第四行包含N个整数C1, C2, ... CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000
【输出格式】
一个整数表示答案
【输入样例】
3
1 1 1
2 2 2
3 3 3
【输出样例】
27
解析:题目中说三个数必须满足:Ai < Bj < Ck ,我的思路是用三个数组来存放三行数据, 然后将每一个数组排序,然后再比较数据。例如三个数组分别为a[i]、b[j]、c[k],用三个for循环比较,因为三个数组都是从小打到,所以在比较过程中如果a[i]>=b[j],或者是b[j]>=c[k]时就停止向下比较,因为往下比较数越来越大,这样就将时间复杂度大大缩短了。
代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class 递增三元组
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n]; //存第一行数据
int[] b = new int[n]; //存第二行数据
int[] c = new int[n]; //存第三行数据
int cnt = 0;
for(int i=0;i<n;++i)
{
a[i] = in.nextInt();
}
for(int i=0;i<n;++i)
{
b[i] = in.nextInt();
}
for(int i=0;i<n;++i)
{
c[i] = in.nextInt();
}
Arrays.sort(a); //升序排序
Arrays.sort(b); //升序排序
Arrays.sort(c); //升序排序
int x = 1; //若值为0时,则不符合题目中的条件
int y = 1; //若值为0时,则不符合题目中的条件
for(int i=0;i<n;++i)
{
if(x==0) //若值为0时,再往下比较都不符合
{
break;
}
for(int j=0;j<n;++j)
{
if(a[i]>=b[j]||y==0) //只要a[i]>=b[j],再往下比较都不符合
{
x = 0;
break;
}
for(int k=0;k<n;++k)
{
if(b[j]>=c[k]) //只要b[j]>=c[k],再往下比较都不符合
{
y = 0;
break;
}
cnt++; //符合a[i]<b[j]<c[k]
}
}
}
System.out.println(cnt); //符合个数
}
}
运行结果:
输入:
3
1 1 1
2 2 2
3 3 3
输出:
27