题目:给定一个乱序数组 {-1, 0, 1, 2, -1, -4},寻找 a + b + c = 0的三元组。并去重。
思路:
一,先排序,从小到大。
二,定义三个指针,第一个a,指向数组第一个位置,第二个b,指向第二个位置,第三个c,指向最后一位。
三,然后,计算a+b+c,看是否等于0。
1.如果等于0,将结果放入set中保存,然后a不动,b往右移动一位,c往左移动一位,继续计算a+b+c。
2.如果小于0,则b往右移动一位,继续计算a+b+c。
3.如果大于0,则c往左移动一位,继续计算a+b+c。
四,当b和c指针碰面时,一轮循环结束,a往后移动一位,继续上述步骤。
最后,当a大于0时,说明往后的所有数都大于0,此时跳出循环,程序结束。
代码:
public static void main(String[] args) {
// 给定一个乱序数组 {-1, 0, 1, 2, -1, -4},寻找 a + b + c = 0的三元组。并去重
//思路:先排序,然后选取第一个元素为a,第二个为b,最后一个为c,然后计算a+b+c,如果等于0,
//a不动,b++,c--依次往后移动,继续上述过程,如果小于0,b往后移动,如果大于0,c往左移动。
int[] arr=new int[] {-1,0,1,2,-1,-4};
//用set来去重
HashSet<String> set=new HashSet<>();
//调用快排从小到大排序
QuickSort.quickSort(arr, 0, arr.length-1);
//排除特殊情况
if(arr.length<3) {
System.out.println("数组不合格");
}
int a=0;//a指针
int b=1;//b指针
int c=arr.length-1;//c指针
//判断,如果a大于0,后面肯定都大于0,结果不可能为0,直接退出循环
while(arr[a]<0) {
//b和c指针碰头,一次结束
if(c<=b) {
a++;
b=a+1;
c=arr.length-1;
}
//等于0
if(arr[a]+arr[b]+arr[c]==0) {
set.add(arr[a]+","+arr[b]+","+arr[c]);
b++;
c--;
}else if(arr[a]+arr[b]+arr[c]<0){//小于,b右移
b++;
}else {//大于,c左移
c--;
}
}
//遍历结果
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}