18. 4Sum LeetCode题解

Given an array S of n integers, are there elements abc, 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.

题意:

给定一个整数数组S,是否存在元素a,b,c,d使得a+b+c+d = target;

在数组中寻找所有满足条件的无重复4元素的元素组;

注:解的集合不包含重复元素组;


题解:

与3sum的思想一致,只是多了一层循环;3sum题解

扫描二维码关注公众号,回复: 2918115 查看本文章

首先将数组排序,假设a,b,c,d大小a<b<c<d,这样从数组开头开始进行枚举;

即a从nums的index为0的位置开始枚举;

b从a的index+1的位置开始枚举;

对于剩下的数组中的数:

c和d采用2sum的双指针的解法,具体而言,(ci和di是c和d的index)

当a + b + nums[ci] + nums[di] < target时ci++

当a + b + nums[ci] + nums[di] > target时di--

a + b + nums[ci] + nums[di] == target时记录

按照上述思想,整理代码如下:


Code【Java】

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        // 创建返回对象
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (nums.length < 3) {
            return ret;
        }
        // 排序数组
        Arrays.sort(nums);
        for (int ai = 0; ai < nums.length - 3; ++ai) {
            // 重复元素则继续
            if (ai != 0 && nums[ai - 1] == nums[ai]) {
                continue;
            }
            // 剔除重复元素
            for (int bi = ai + 1; bi < nums.length - 2; ++bi) {
                if (bi != ai + 1 && nums[bi - 1] == nums[bi]) {
                    continue;
                }
                // 2sum部分
                int ci = bi + 1;
                int di = nums.length - 1;
                while (ci < di) {
                    int ans = nums[ai] + nums[bi] + nums[ci] + nums[di];
                    if (ans == target) {
                        ret.add(new ArrayList(Arrays.asList(nums[ai], nums[bi], nums[ci], nums[di])));
                        ci++;
                        di--;
                        while (ci < di && nums[ci - 1] == nums[ci]) ci++;
                        while (ci < di && nums[di] == nums[di + 1]) di--;
                    }
                    else if (ans < target) {
                        ci++;
                    }
                    else {
                        di--;
                    }
                }
            }
        }
        return ret;
    }
}


Code【C++】

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        // 开始寻找
        vector<vector<int>> ret;
        if (nums.size() < 3) {
            return ret;
        }
        // 排序数组
        sort(nums.begin(), nums.end());
        for (int ai = 0; ai < nums.size() - 3; ++ai) {
            // 重复元素则继续
            if (ai != 0 && nums[ai - 1] == nums[ai]) {
                continue;
            }
            // 剔除重复元素
            for (int bi = ai + 1; bi < nums.size() - 2; ++bi) {
                if (bi != ai + 1 && nums[bi - 1] == nums[bi]) {
                    continue;
                }
                // 2sum部分
                int ci = bi + 1;
                int di = nums.size() - 1;
                while (ci < di) {
                    int ans = nums[ai] + nums[bi] + nums[ci] + nums[di];
                    if (ans == target) {
                        vector<int> tmp = {nums[ai], nums[bi], nums[ci], nums[di]};
                        ret.push_back(tmp);
                        ci++;
                        di--;
                        while (ci < di && nums[ci - 1] == nums[ci]) ci++;
                        while (ci < di && nums[di] == nums[di + 1]) di--;
                    }
                    else if (ans < target) {
                        ci++;
                    }
                    else {
                        di--;
                    }
                }
            }
        }
        return ret;
    }
};


猜你喜欢

转载自blog.csdn.net/baidu_23318869/article/details/72829292
今日推荐