四数之和/C++

与三数之和的思路类似,没看过三数之和的朋友可以先看看三数之和/C++

唯一变的就是在i外面加了一层for循环k,然后剪枝操作稍微变了一下,因为三数相加只需要目标值大于0即可,所以num[i]>0即可剪枝,但是target的值不一定都是整数,也可能是负数,所以按照三数之和的思路num[k]>target即可剪枝的思想是错误的,例如 -2 -1 -1 1,target=-3,虽然-2>-3,但是这里是不可以剪枝的,-2 -1 -1 1也是满足要求的元组。其他的思路和三数之和的思路就是一模一样的了。

代码:

//四数之和,a+b+c+d=target,不包含重复元组 
#include<iostream>
#include<algorithm>
using namespace std;
#define LEN 6
int main()
{	
	int target = 0;
	int num[] = {1,0,-1,0,-2,2};
	sort(num,num+LEN);
	for(int k=0;k<LEN;k++)
	{
		if(num[k]>target && num[k]>=0) break; //剪枝操作 
		if(k>0 && num[k] == num[k-1]) continue;	//去重操作 
		for(int i=k+1;i<LEN;i++)
		{
			if(num[k]+num[i]>target && num[k]+num[i]>=0) break;	//剪枝操作 
			if(i>k+1 && num[i]==num[i-1]) continue; //去重操作
			int left = i+1;
			int right = LEN-1;
			while(left<right)
			{
				if(num[k]+num[i]+num[left]+num[right]<target) left++;
				else if(num[k]+num[i]+num[left]+num[right]>target) right--;
				else
				{
					cout<<num[k]<<" "<<num[i]<<" "<<num[left]<<" "<<num[right]<<endl;
					while(left<right && num[left] == num[left+1]) left++;	//去重操作 
					while(left<right && num[right] == num[right-1]) right--;	//去重操作 
					left++;
					right--;
				}
			} 
		}
	}
	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值