ThreeSum程序会统计一个文件中所有和为0的三整数元组的数量。ThreeSun用一个三重循环进行查找
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)
cnt++;
运行时间是关于数组大小的立方级别的
改进后的算法思路:
1.先将数组进行排序
2.将第三层循环判断改为二分查找
数量级由立方级别变为平方对数级别
package _1_3linkedList;
import java.util.Arrays;
import java.util.Scanner;
import edu.princeton.cs.algs4.BinarySearch;
/*3-sum问题平方对数级别解法
*/
public class ThreeSumFast
{
public static int count(int [] a)
{/*计算和为0的三元组的数目*/
Arrays.sort(a);
int N=a.length;
int cnt=0;
for(int i=0;i<N;i++)
for(int j=i+1;j<N;j++)
if(BinarySearch.rank(-a[i]-a[j], a)>j) /*在有序数列里进行二分查找*/
cnt++; /*二分查找返回的数<j时不可重复计数*/
return cnt;
}
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int[] a=new int[N];
for(int i=0;i<N;i++)
a[i]=sc.nextInt();
System.out.println(count(a));
}
}
7
1 2 3 4 -3 -2 -1
3