LeetCode 18. 4Sum

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

 

Subscribe to see which companies asked this question

#include "common.h"
using namespace std;

/*
leetcode 18. 4Sum
时间复杂度: N^3
该题如果用暴力搜索,四重循环,时间复杂度是N^4,这样很可能
会超时,所以考虑先排序所有的元素,然后对四个变量也按照一定
的前后顺序排列,有方向的搜索解(四个元素的和比较target来确定
搜索方向)
这里要考虑去重,每一个循环里都要考虑
*/

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int> > record;
		record.clear();
		if(nums.size()<4) return record;
		vector<int> temp;
		int a=0,b=0,c=0,d=0;
        sort(nums.begin(),nums.end());
		for(a=0;a<nums.size()-3;a++)
		{
		    if(nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target) break;//剪枝操作
			if(a!=0 && nums[a]==nums[a-1]) //去重操作
					continue;
			for(d=nums.size()-1;d>2;d--)
			{
			    if(nums[d]+nums[d-1]+nums[d-2]+nums[d-3]<target) break;//剪枝操作,效果很明显
				if(d!=(nums.size()-1) && nums[d]==nums[d+1]) //去重操作
					continue;
				b=a+1;
				c=d-1;
				while(b<c)
				{
					//去重操作
					if(nums[b]==nums[b-1] && (b-1)!=a)
					{
						b++;
						continue;
					}
					if(nums[c]==nums[c+1] && (c+1)!=d)
					{
						c--;
						continue;
					}
					if(target==(nums[a]+nums[b]+nums[c]+nums[d]))
					{
						temp.clear();
						temp.push_back(nums[a]);
						temp.push_back(nums[b]);
						temp.push_back(nums[c]);
						temp.push_back(nums[d]);
						record.push_back(temp);
						b++;
					}
					else if(target<(nums[a]+nums[b]+nums[c]+nums[d]))
						c--;
					else
						b++;
				}
			}	
		}
		return record;
    }
};


int main() {
	int a[]={5,5,3,5,1,-5,1,-2};
	vector<int> nums(a,a+sizeof(a)/sizeof(int));
	for(int i=0;i<nums.size();i++)
		cout<<nums[i]<<" ";
	cout<<endl;
	int target=4;
	Solution s;
	vector<vector<int> > ve;
	ve=s.fourSum(nums,target);
	for(int i=0;i<ve.size();i++)
	{
		cout<<endl;
		for(int j=0;j<ve[i].size();j++)
			cout<<ve[i][j]<<" ";
	}
	getchar();
	return 0;
}



 

转载于:https://www.cnblogs.com/gremount/p/5768002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值