【LeetCode】18. 4Sum

来源:互联网 发布:果壳网和知乎 编辑:程序博客网 时间:2024/06/04 11:20

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]]

解题思路

双指针问题。
思路还是与3Sum问题相似。差异在于,此处是依次固定第一和第二个数字,然后通过双指针移动控制第三和第四个数字;而3Sum则只需固定第一个数字。
注意:要仔细分析所有while循环的控制条件,防止出现死循环。

AC代码

class Solution {public:    vector<vector<int> > fourSum(vector<int>& nums, int target) {        sort(nums.begin(), nums.end());        vector<vector<int> > ans;        const int vSize = nums.size();        //fix the first number        for (int first = 0; first < vSize - 3; ++first) {            //fix the second number            for (int second = first + 1; second < vSize - 2; ++second) {                int third = second + 1;                int forth = vSize - 1;                while (third < forth) {                    int curSum = nums[first] + nums[second] + nums[third] + nums[forth];                    if (curSum < target)                        third++;                    else if (curSum > target)                        forth--;                    else {                        vector<int> tempAns;                        //注意此处push_back的是数值nums[first],而非下标first                        tempAns.push_back(nums[first]);                        tempAns.push_back(nums[second]);                        tempAns.push_back(nums[third]);                        tempAns.push_back(nums[forth]);                        ans.push_back(tempAns);                        //此处不可以直接写nums[third+1]==nums[third]                        //因为要确保third一定会被更新到                        while (third < forth && nums[third] == tempAns[2]) third++;                        while (third < forth && nums[forth] == tempAns[3]) forth--;                    }                }                while (second < vSize - 1 && nums[second + 1] == nums[second]) second++;            }            while (first < vSize - 1 && nums[first + 1] == nums[first]) first++;        }        return ans;    }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美宝旅行证丢失怎么办 汽车证件全丢了怎么办 车的行驶本丢了怎么办 车和行驶证丢了怎么办 考驾照人在外地怎么办 外地考驾照没有居住证怎么办 考驾驶证预约密码忘了怎么办 考驾照密码忘了怎么办 考驾照的密码忘了怎么办 手机银行登录密码忘了怎么办 宽带账号或密码错误怎么办 车险过户联系不上原车主怎么办 换车了etc忘拆了怎么办 c1d驾驶证d证到期了怎么办 摩托车驾驶证过五年怎么办 没居住证想上东莞牌怎么办 外地考驾照需要暂住证怎么办 考驾照期间暂住证过期怎么办 b2驾照扣了6分怎么办 c1驾照扣了11分怎么办 c1驾驶证分扣9分怎么办 驾驶证c照扣6分怎么办 驾照过期1个月怎么办 上海驾驶证b证扣分怎么办 临时牌驾照丢了怎么办 行驶证年审过期两年怎么办 驾证到期了没换怎么办 在非洲被蚊子咬怎么办 身份证丢了被非法贷款怎么办 未满16岁怎么办身份证 放弃继承权后想反悔怎么办 上海居住证积分中社保断怎么办 换驾驶证但是身份证地址变动怎么办 驾驶证b证扣分了怎么办 c1驾证过期没审怎么办 驾照报名三年过期了怎么办 新车行驶证过期了怎么办 行驶证忘了审怎么办 摩托车驾驶证副本丢了怎么办 人被全险车撞了怎么办 被全险车撞了怎么办