LeetCode 4Sum

来源:互联网 发布:北京软件学院 编辑:程序博客网 时间:2024/06/17 10:59

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
原创粉丝点击