三元组a+b+c=0算法(三数相加)

题目:给定一个乱序数组 {-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());
		}

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值