18. 4Sum

来源:互联网 发布:广州多想网络 骗 编辑:程序博客网 时间:2024/06/16 04:37

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

思路1:将数组排序,然后可以将问题降到O(N^3)的复杂度

vector<vector<int>> fourSum(vector<int>& nums, int target) {    vector<vector<int>> res;    if (nums.size() < 4)return res;    sort(nums.begin(), nums.end());    for (int i = 0; i < nums.size() - 3; i++){        //去重操作        if (i > 0 && nums[i - 1] == nums[i])continue;        for (int j = i + 1; j < nums.size() - 2; j++){            //去重操作            if (j > i + 1 && nums[j] == nums[j - 1])continue;            int low = j + 1, high = nums.size() - 1;            int temp = nums[i] + nums[j];            while (low < high){                if (temp + nums[low] + nums[high] > target)high--;                else if (temp + nums[low] + nums[high] < target)low++;                else {                    res.push_back({ nums[i], nums[j], nums[low], nums[high] });                    low++, high--;                    while (low < high && nums[low] == nums[low - 1])low++;                    while (low < high && nums[high] == nums[high + 1])high--;                }            }        }    }    return res;}

思路2:在第一层循环和第二层循环多一些判断,可以减少算法的循环次数

vector<vector<int>> fourSum(vector<int>& nums, int target) {    vector<vector<int>> res;    if (nums.size() < 4)return res;    sort(nums.begin(), nums.end());    int len = nums.size();    for (int i = 0; i < nums.size() - 3; i++){        //在此处判断是否重复以及是否有越界或小于target操作        if (i > 0 && nums[i - 1] == nums[i])continue;        if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target)break;        if (nums[i] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target)continue;        for (int j = i + 1; j < nums.size() - 2; j++){            //在此处判断是否重复以及是否有越界或小于target操作            if (j > i + 1 && nums[j] == nums[j - 1])continue;            if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target)break;            if (nums[i] + nums[j] + nums[len - 1] + nums[len - 2] < target)continue;            int low = j + 1, high = nums.size() - 1;            int temp = nums[i] + nums[j];            while (low < high){                int sum = temp + nums[low] + nums[high];                if (sum > target)high--;                else if (sum < target)low++;                else {                    res.push_back({ nums[i], nums[j], nums[low], nums[high] });                    low++, high--;                    while (low < high && nums[low] == nums[low - 1])low++;                    while (low < high && nums[high] == nums[high + 1])high--;                }            }        }    }    return res;}
原创粉丝点击