18. 4Sum

2018/05/07 leetcode 共 1171 字,约 4 分钟

Title

the problem link

Given an array nums of n integers and an integer target, are there elements a, b, c, 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]
]

注意不能冗余,所以可以判断每个数是否冗余,但其实判断3个就够了,三个不冗余,第四个即使duplicate也不等于target了

Solution

//cpp:
class Solution {
public:
	vector<vector<int>> fourSum(vector<int>& nums, int target) {
		vector<vector<int>> res;
		sort(nums.begin(), nums.end());
		for (int i = 0; i < nums.size(); i++) {
			if (i > 0 && nums[i] == nums[i - 1]) continue;
			for (int j = i + 1; j < nums.size(); j++) {
				if (j > i + 1 && nums[j] == nums[j - 1]) continue;
				int lo = j + 1, hi = nums.size() - 1;
				while (lo < hi) {
					int sum = nums[i] + nums[j] + nums[lo] + nums[hi];
					if (sum == target) {
						res.push_back({ nums[i],nums[j],nums[lo],nums[hi] });
						while (lo<hi&&nums[lo] == nums[lo + 1]) lo++;
						//while (lo<hi&&nums[hi] == nums[hi - 1]) hi--;
						lo++;
						hi--;
					}
					else if (sum > target) {
						hi--;
					}
					else {
						lo++;
					}

				}
			}
		}
		return res;
	}
};

Search

    Table of Contents