两种不同的方法实现如下:
package com.runoob.test;
import java.util.Arrays;
import edu.princeton.cs.algs4.BinarySearch;
//两层for循环实现
public class TwoSum {
public static int count(int[] a) {
int cnt=0;
Arrays.sort(a);
int N=a.length;
for(int i=0;i<N;i++) {
for(int j=i+1;j<N;j++) {
if(a[i]+a[j]==0) {
cnt++;
}
}
}
return cnt;
}
}
package com.runoob.test;
import java.util.Arrays;
import edu.princeton.cs.algs4.BinarySearch;
//二分查找+一层
public class TwoSumFast {
public static int count(int[] a) {
int cnt=0;
Arrays.sort(a);
int N=a.length;
for(int i=0;i<N;i++) {
if(BinarySearch.rank(-a[i], a)>i) {
cnt++;
}
}
return cnt;
}
}
测试代码如下
package com.runoob.test;
/**
* 这是呆呆的测试代码
*/
//import java.util.Arrays;
import java.util.Scanner;
import java.util.Iterator;
import edu.princeton.cs.algs4.*;
public class TestDrive {
public static void main(String[] args) {
int N=Integer.parseInt(args[0]);
int[] a=new int[N];
for(int i=0;i<N;i++) {
a[i]=StdRandom.uniform(-1000000, 1000000);
}
StopWatch timer=new StopWatch();
//int cnt=TwoSum.count(a);//用时0.017seconds
int cnt=TwoSumFast.count(a);//用时0.004seconds
double time=timer.elapsedTime();
System.out.println(time+"seconds");
}
}