描述
给定三个整数数组A = [A1, A2, … AN],B = [B1, B2, … BN],C = [C1, C2, … CN],
请你统计有多少个三元组(i, j, k) 满足:
- 1 <= i, j, k <= N
- Ai < Bj < Ck
这个题的思路是参考网上一个大神的思路,大神就是大神啊,我还差的远啊
参考的大神思路是首先把三个数组排好序,再进行选择比较
排序就不多说了,冒泡很快解决,但是在选择有多条路径的时候可真是难倒我了
最后我的方法是这样的:
1.建立两个数组:ab[ ][ ] 和bc[ ]
2.ab是A和B数组之间的联系,只要a[i]<b[j],就将ab[i][j]设为1
3.bc是B和C之间的联系,因为已经排好序了,所以如果b[j]<c[k]则b[j]<c[k]后面的任意一个数,也就是说比b[j]大的数有c.length-1个数
4.之后当ab[i][j]==1时,则count+=b[j]
画个图更好理解一些
好吧…图片一直上传失败,心疼自己,感觉过一段再来看可能就看不懂了
只粘个选择路径的代码把,为了写这个方法花费了好长时间,因为一开始怎么也没想到该怎么计算路径的数量,唉。。。烦
这是单独写成了一个类,为了方便实验成功性,用的是题目上给的那三个数组ABC
最后又把代码粘贴到源代码里头的
public class xuanze {
public static void main(String args[]){
int a[]={1,1,1};
int b[]={2,2,2};
int c[]={3,3,3};
int ab[][]=new int[10][10];
int bc[]=new int[10];
int i=0,j=0,k=0;
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(a[i]<b[j]){
ab[i][j]=1;
}
}
}
int j1=0,k1=0;
while(j1<b.length){
while(k1<c.length){
if(b[j1]<c[k1]){
bc[j1]=c.length-k1;
break;
}
else{
k1++;
}
}
j1++;
}
int count=0;
for(int ab1=0;ab1<ab.length;ab1++){
for(int bc1=0;bc1<ab.length;bc1++){
if(ab[ab1][bc1]==1){
count+=bc[bc1];
}
}
}
System.out.println(count);
}