LeetCode 18. 四数之和(C++)

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

思路:和15题非常类似,不过我偷懒,直接把15题的方法直接放到了另一个函数里,但是没有对第一个元素去重,所以就只超过了83%的人。对这个去重理解不到位啊有木有!~(@^_^@)~

我的解答:

static int x = []{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return 0;
}();
class Solution {
public:
    vector > fourSum(vector& nums, int target) 
    {
        vector > res;
        vector temp;
        sort(nums.begin(),nums.end());
        int len=nums.size();
        for(int i=0; i >& res,const vector& nums, vector& temp, int left, int right, int num)
    {
        for(;leftnum)
                {
                    r--;
                }else
                {
                    temp.push_back(nums[l]);
                    temp.push_back(nums[r]);
                    res.push_back(temp);
                    temp.pop_back();
                    temp.pop_back();
                    l++;
                    r--;
                }
            }
            while(nums[left+1]==nums[left])
            {
                left++;
            }
            temp.pop_back();
        }
    }
};

执行用时为8ms的用例:

static const auto _ = []() {ios::sync_with_stdio(false); cin.tie(nullptr); return nullptr; }();

class Solution {
public:
	vector> fourSum(vector& nums, int target) {
		int n = nums.size();
		if (n < 4)return {};
		sort(nums.begin(), nums.end());
		vector> res;
		for (int i = 0; i < n - 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[n - 3] + nums[n - 2] + nums[n - 1] < target)
				continue;

			for (int j = i + 1; j < n - 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[n - 2] + nums[n - 1] < target)
					continue;
				// 移动指针搜索
				int l = j + 1, r = n - 1;
				while (l < r) {
					int sum = nums[i]+ nums[j]+ nums[l]+ nums[r];
					if (sum == target) {
						res.push_back({ nums[i], nums[j], nums[l], nums[r] });
						// 三四元素去重
						while (l < r&&nums[l] == nums[l + 1])l++;
						while (l < r&&nums[r] == nums[r - 1])r--;
						l++; r--;
					}
					else if (sum < target) {
						l++;
					}
					else if (sum > target) {
						r--;
					}
				}
			}
		}
		return res;
	}
};

 

你可能感兴趣的:(数据结构,算法,leetcode)