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]
]
分析:
给定一个数列,求出任意四个元素之和等于0的元素输出。
先排序,然后采用左右夹逼的方法,求出满足要求的元素,时间复杂度O(n^3),空间复杂度O(1).
C++实现:
Class Solution{
public:
vector<vector<int> > FourSum(vector<int> & nums, int target){
vector<vector<int> > result;
if (nums.size() < 4)
return result;
sort(nums.begin(), nums.end());
auto last = nums.end();
for (auto a = nums.begin(); a < prev(last, 3); ++a){
for (auto b = next(a); b < prev(last, 2); ++b){
auto c = next(b);
auto d = last - 1;
while (c < d){
if (*a + *b + *c + *d < target)
++c;
else if (*a + *b + *c + *d > target)
--d;
else
{
result.push_back({ *a, *b, *c, *d });
++c;
--d;
}
}
}
}
sort(result.begin(), result.end());
result.erase(unique(result.begin(),result.end()),result.end());
return result;
}
};
python实现:
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
res = []
for i in xrange(0, len(nums)):
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in xrange(i + 1, len(nums)):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
start = j + 1
end = len(nums) - 1
while start < end:
sum = nums[i] + nums[j] + nums[start] + nums[end]
if sum < target:
start += 1
elif sum > target:
end -= 1
else:
res.append((nums[i], nums[j], nums[start], nums[end]))
start += 1
end -= 1
while start < end and nums[start] == nums[start - 1]:
start += 1
while start < end and nums[end] == nums[end + 1]:
end -= 1
return res