3-sum问题:统计一个不重复数组中3个数相加为0的组合。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] in = { 3, 4, 5, 6, 1, -6, 8, 21 };
Arrays.sort(in);
//-6,1,3,4,5,6,8,21
Main m = new Main();
int length = in.length;
int count = 0;
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
// (X > j)的这个动作非常重要,让其向后查找
//如果(X != -1)的话,会出现重复的情况,
//例如:-6 1 5 和 -6 1 5 重复
//会重复查找3两次 ,会出现 -6 3 3 的情况
if (m.binarySearch(in, -(in[i] + in[j])) > j) {
count++;
}
}
}
System.out.println("有"+count+"个3个数和为0的组合");
}
//二分查找
public int binarySearch(int[] in, int key) {
Arrays.sort(in);
int lo = 0;
int hei = in.length - 1;
while (lo < hei) {
int mid = hei + (lo - hei) / 2;
if (key < in[mid]) {
hei = mid - 1;
} else if (key > in[mid]) {
lo = mid + 1;
} else {
return mid;
}
}
return -1;
}
}