4sum

题目:

点击打开链接

解答:

参考网上的一份比较标准的代码。

做法: 先转化为求3sum  然后再转化为求2sum

通过只从小到大搜索,跳过重复元素,来达到避免结果重复的目的。

代码:

 class Solution {
 public:
	 vector<vector<int> >  fourSum(vector<int> &num, int target) {
		 int i, j, k, l, sum;
		 vector<int> temp;
		 vector<vector<int> > res;
		 sort(num.begin(), num.end());
		 for (i = 0; i < num.size(); i++)
		 {
			 if (i != 0 && num[i] == num[i - 1])
				 continue;
			 //为什么要j = i+1; 因为元素从小到大排列
			 //所以从小到大进行查找,肯定不会遗漏元素。
			 for (j = i + 1; j < num.size(); j++)
			 {
				 if (j != i + 1 && num[j] == num[j - 1])
					 continue;
				 k = j + 1; l = num.size() - 1;
				 while(k<l)
				 {
					 sum = num[i] + num[j] + num[k] + num[l];
					 if (target > sum)
					 {
						 ++k;
					 }
					 else if (target < sum)
					 {
						 --l;
					 }
					 //在这里避免重复元素
					 else if (k != j + 1 && num[k] == num[k - 1])
					 {
						 ++k;
					 }
					 //在这里避免重复元素
					 else if (l != num.size() - 1 && num[l] == num[l + 1])
					 {
						 --l;
					 }
					 else
					 {
						 temp.clear();
						 temp.push_back(num[i]);
						 temp.push_back(num[j]);
						 temp.push_back(num[k]);
						 temp.push_back(num[l]);
						 res.push_back(temp);
						 ++k;
						 --l;
					 }
				 }
			 }
		 }
		 return res;
	 }
 };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值