LeetCode 4Sum

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值