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

4Sum

时间:2016-04-02 10:49:40      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

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:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, abcd)
  • 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)
为了避免包含重复的情况,需要跳过重复的部分.
这道题的方法也非常类似2 sum的第二种解法。首先我们还是先把数组排一个顺序, 然后我们现在还是需要四个指针i,j,x,y, 我们假设i<j<x<y,因为我们排了序,那么a[i]<a[j]<a[x]<a[y], 实际上题意可以转换为a[i]+a[j]+a[x]+a[y]=v.
我们如果枚举i,j的话,那么题意又可以转换为在大于a[j]的元素当中寻找a[x]+a[y] = v-a[i]-a[j] ,那么这个问题就是2sum的问题,所以我们可以用2sum 两个指针指向一头一尾的方法解决这道题。
	public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
		ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
		Arrays.sort(num);

		for (int i = 0; i < num.length - 3; i++) {
			if (i != 0 && num[i] == num[i - 1]) {
				continue;
			}

			for (int j = i + 1; j < num.length - 2; j++) {
				if (j != i + 1 && num[j] == num[j - 1])
					continue;

				int left = j + 1;
				int right = num.length - 1;
				while (left < right) {
					int sum = num[i] + num[j] + num[left] + num[right];
					if (sum < target) {
						left++;
					} else if (sum > target) {
						right--;
					} else {
						ArrayList<Integer> tmp = new ArrayList<Integer>();
						tmp.add(num[i]);
						tmp.add(num[j]);
						tmp.add(num[left]);
						tmp.add(num[right]);
						rst.add(tmp);
						left++;
						right--;
						while (left < right && num[left] == num[left - 1]) {
							left++;
						}
						while (left < right && num[right] == num[right + 1]) {
							right--;
						}
					}
				}
			}
		}

		return rst;
	}
}

  

4Sum

标签:

原文地址:http://www.cnblogs.com/FLAGyuri/p/5347033.html

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