ThreeSum 算法
为统计一个文件中所有和为0的三整数元组的数量(假设整数不会溢出)。
比较一下它不同的算法的优劣
1.第一种算法,时间复杂度近似为N^3
//第一种算法
public static int count(int[] a) {
int n = a.length;
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
for (int k = j+1; k < n; k++) {
if (a[i] + a[j] + a[k] == 0) {
count++;
}
}
}
}
return count;
}
2.第二种算法 时间复杂度为N^2log2N
//第二种算法
public static int count1(int[] a) {
int n = a.length;
int count = 0;
Arrays.sort(a);//数组归并排序法
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
//二分法查找
if (rank(-a[i] - a[j], a) > j) {
count++;
}
}
}
return count;
}
//二分法查找
public static int rank(int key,int[] a){
int lo=0;//数组的第一个元素
int hi=a.length-1;//数组的最后一个元素
while (lo<=hi){
int mid=lo + (hi-lo)/2;//二分点
if(key<a[mid]) {
hi=mid-1;
}else if(key>a[mid]){
lo=mid+1;
}else {
return mid;//返回查找数组的下标
}
}
return -1;//没有查到的话返回-1
}
可以看出,第二种算法要比第一种优化许多。当然我相信还有更好的算法!! !