这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
第六题:递增三元组
题目描述
给定三个整数数组 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。
对于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
资源约定: 峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 不要使用package语句。不要使用jdk1.7及以上版本的特性。 主类的名字必须是:Main,否则按无效代码处理。
代码1
暴力求解
package day_07;
import java.util.Scanner;
public class 递增三元组 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr[]=new int[3][n];
for(int i=0;i<3;i++) {
for(int j=0;j<n;j++) {
arr[i][j]=sc.nextInt();
}
}
int count=0;
for(int i=0;i<n;i++) {
for (int j = 0; j < n; j++) {
for(int k=0;k<n;k++) {
if(arr[0][i]<arr[1][j]&&arr[1][j]<arr[2][k]) {
count++;
}
}
}
}
System.out.println(count);
}
}
代码1的优化
优化前:
优化后:
优化处:
for(int i=0;i<n;i++) {
for (int j = 0; j < n; j++) {
//如果数组b[j]的值小于a[i]就不在循环c[k]
if(arr[0][i]<arr[1][j]) {
for(int k=0;k<n;k++) {
if(arr[1][j]<arr[2][k]) {
count++;
}
}
}
}
}
代码2
我们可以从中间的数开始记录,将b大于的a数值记录下来,将b小于c的个数记下来。
package day_07;
import java.util.Scanner;
public class 递增三元组 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr[]=new int[3][n];
for(int i=0;i<3;i++) {
for(int j=0;j<n;j++) {
arr[i][j]=sc.nextInt();
}
}
long startTime=System.currentTimeMillis();
int count=0;
int[] num=new int[2];
for(int j=0;j<n;j++) {
num[0]=0;
num[1]=0;
for(int i=0;i<n;i++) {
if(arr[1][j]>arr[0][i]) {
num[0]++;
}
}
for(int k=0;k<n;k++) {
if(arr[1][j]<arr[2][k]) {
num[1]++;
}
}
count=count+num[0]*num[1];
}
long endTime=System.currentTimeMillis();
System.out.println("程序运行时间为:"+(endTime-startTime));
System.out.println(count);
}
}