您的位置:首页 > 其它

4Sum

2015-07-20 15:45 204 查看
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:

Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)

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)


解题思路:

(1)对数组进行递增排序

(2)第一个加数从前到后枚举

(3)第二个加数从前到后枚举

(4)设置两个指针分别指向第三个和第四个加数,第三个加数从前往后移动,第四个加数从后往前移动

(5)加数去重的方法

class Solution {

public:

vector<vector<int>> fourSum(vector<int>& nums, int target) {

int numsSize = nums.size();

//对数组进行递增排序
sort(nums.begin(), nums.end());

vector<vector<int>> res;
for (int i = 0; i < numsSize; i++)
{
//对元素nums[i]去重
while((i > 0) && (nums[i] == nums[i-1]) && (i < numsSize-3))
{
i++;
}

for (int j = i+1; j < numsSize; j++)
{
//对元素nums[j]去重
while ((j > i+1) && (nums[j] == nums[j-1]) && (j < numsSize-2))
{
j++;
}

int k = j+1;
int m = numsSize-1;
while (k < m)
{
int sum = nums[i]+nums[j]+nums[k]+nums[m];
if (sum < target)
{
k++;
while (nums[k] == nums[k-1] && k < m)
{
k++;
}
}
else if (sum > target)
{
m--;
while (nums[m] == nums[m+1] && k < m)
{
m--;
}
}
else
{
vector<int> temp(4);
temp[0] = nums[i];
temp[1] = nums[j];
temp[2] = nums[k++];
temp[3] = nums[m--];
res.push_back(temp);

while (nums[k] == nums[k-1] && k < m)
{
k++;
}
while (nums[m] == nums[m+1] && k < m)
{
m--;
}
}
}
}
}

return res;

}


};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: