您的位置:首页 > 编程语言 > Java开发

3-sum问题平方对数级别解法(algs4)

2017-08-18 15:46 225 查看
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
;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  three-sum 算法 Java