首页 > 其他 > 详细

LeetCode OJ 4Sum

时间:2015-03-25 12:11:18      阅读:134      评论:0      收藏:0      [点我收藏+]

Given an array S of n integers, are there elements abc, 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:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
  • 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)

Show Tags
之前好像在《挑战程序设计》中看到这题,方法忘了,大概是这样吧:
首先来个n^2的处理,得到两个和的值sum2,并排序sum2数组,然后在此数组中二分查找target-sum2的值即可。
O(n)=n^2。
struct S2 {
	int sum, p1, p2;
	S2(int sum = 0, int p1 = 0, int p2 = 0) {
		this->sum = sum;
		this->p1 = p1;
		this->p2 = p2;
	}
};

bool cmp(const S2 & s1, const S2 & s2) {
	return s1.sum < s2.sum;
}

class Solution {
public:
	vector<S2> sum2;
	vector<vector<int> > fourSum(vector<int> &num, int target) {
		vector<vector<int> > ans;
		if (num.size() < 4) return ans;
		set<vector<int> > exist;
		sum2.clear();
		int s = num.size();
		for (int i = 0; i < s; i++) {
			for (int j = i + 1; j < s; j++) {
				sum2.push_back(S2(num[i] + num[j], i, j));
			}
		}
		sort(sum2.begin(), sum2.end(), cmp);
		int ss = sum2.size();
		for (int i = 0; i < ss; i++) {
			int t = target - sum2[i].sum;
			int pos = BSearch(0, ss - 1, t);
			if (pos == -1) continue;
			while (pos < ss && sum2[pos].sum == t) {
				if (pos != i && (sum2[pos].p1 != sum2[i].p1 && sum2[pos].p1 != sum2[i].p2 && sum2[pos].p2 != sum2[i].p1 && sum2[pos].p2 != sum2[i].p2)) {
					vector<int> in;
					in.push_back(num[sum2[i].p1]);
					in.push_back(num[sum2[i].p2]);
					in.push_back(num[sum2[pos].p1]);
					in.push_back(num[sum2[pos].p2]);
					sort(in.begin(), in.end());
					if (exist.find(in) == exist.end()) {
						exist.insert(in);
						ans.push_back(in);
					}
				}
				pos++;
			}
		}
		return ans;
	}
	int BSearch(int l, int r, int target) {
		if (sum2.size() == 0) return -1;
		while (l < r) {
			int m = l + ((r - l) >> 1);
			if (sum2[m].sum < target) l = m + 1;
			else r = m;
		}
		if (sum2[l].sum == target) return l;
		else return -1;
	}
};


LeetCode OJ 4Sum

原文:http://blog.csdn.net/u012925008/article/details/44619413

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!