码迷,mamicode.com
首页 > 其他好文 > 详细

18. 4Sum

时间:2018-10-03 00:30:20      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:end   run   HERE   which   data   int   c++   code   nbsp   

Given an array nums of n integers and an integer target, are there elements abc, and d in nums 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.

Example:

Given array nums = [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]
]

 

AC code:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int len = nums.size();
        vector<vector<int>> v;
        if (len < 4) return v;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < len-3; ++i) {
            if (i > 0 && nums[i] == nums[i-1]) 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 < len -2; ++j) {
                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-2] + nums[len-1] < target) continue;
                int left = j + 1;
                int right = len - 1;
                while (left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        v.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});
                        // don‘t use while statement.
                        do {
                            left++;
                        } while (left < right && nums[left] == nums[left-1]);
                        
                        do {
                            right--;
                        } while (left < right && nums[right] == nums[right+1]);
                    }
                }
            }
        }
        return v;
    }
};

Runtime: 20 ms, faster than 75.88% of C++ online submissions for 4Sum.

 

18. 4Sum

标签:end   run   HERE   which   data   int   c++   code   nbsp   

原文地址:https://www.cnblogs.com/ruruozhenhao/p/9738737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!