4 Sum

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, a ≤ b ≤ c ≤ d)

The solution set must not contain duplicate quadruplets.

Example

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)

解题思路:看到提示是使用Hashmap来做,没想到怎么处理。自己实现了全部迭代的解法,全部迭代因为不会出现重复计算,所以计算量也还是可以控制。参考网上的解法,实现双指针夹逼解法。

解法一:

public class Solution {
    /**
     * @param numbers : Give an array numbersbers of n integer
     * @param target : you need to find four elements that's sum of target
     * @return : Find all unique quadruplets in the array which gives the sum of
     *           zero.
     */
    public ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target) {
		Arrays.sort(numbers);
		ArrayList<ArrayList<Integer>> res = find(numbers, target, 0, 4);
		return res == null ? new ArrayList<ArrayList<Integer>>() : res;
	}

	public ArrayList<ArrayList<Integer>> find(int[] numbers, int target, int i, int n) {
		int N = numbers.length;
		if (n == 1) {
			while (i < N && numbers[i] != target)
				i++;

			if (i < N) {
				ArrayList<Integer> l = new ArrayList<Integer>();
				l.add(numbers[i]);
				ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
				list.add(l);
				return list;
			} else
				return null;
		} else {
			int t = i;
			ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
			while (t + n <= N) {
				if (t > i && numbers[t] == numbers[t - 1]) {
					t++;
					continue;
				}

				target = target - numbers[t];
				ArrayList<ArrayList<Integer>> list = find(numbers, target, t + 1, n - 1);

				if (list != null) {
					for (ArrayList l : list) {
						l.add(0, numbers[t]);
						res.add(l);
					}
				}
				target = target + numbers[t];
				t++;
			}
			if (res.size() > 0)
				return res;
			else
				return null;
		}
	}

}

解法二:

public class Solution {
    /**
     * @param numbers : Give an array numbersbers of n integer
     * @param target : you need to find four elements that's sum of target
     * @return : Find all unique quadruplets in the array which gives the sum of
     *           zero.
     */
    public ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target) {
		Arrays.sort(numbers);
		ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
		if (numbers == null || numbers.length < 4)
			return res;

		int N = numbers.length;
		for (int i = 0; i < N - 3; i++) {
			for (int j = i + 1; j < N - 2; j++) {
				int l = j + 1;
				int h = N - 1;
				while (l < h) {
					int sum = numbers[i] + numbers[j] + numbers[l] + numbers[h];
					if (sum < target)
						l++;
					else if (sum > target)
						h--;
					else {
						boolean find = false;
						for (ArrayList<Integer> ll : res) {
							if (ll.get(0) == numbers[i] && ll.get(1) == numbers[j] && ll.get(2) == numbers[l]
									&& ll.get(3) == numbers[h])
								find = true;
						}
						if (!find) {
							ArrayList<Integer> ll = new ArrayList<Integer>();
							ll.add(numbers[i]);
							ll.add(numbers[j]);
							ll.add(numbers[l]);
							ll.add(numbers[h]);
							res.add(ll);
						}
						l++;
						h--;
					}
				}
			}
		}

		return res;
	}

}
时间: 2024-10-11 09:51:09

4 Sum的相关文章

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

129. Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

31.SUM() 函数

SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5

1305 Pairwise Sum and Divide

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum 给出数组A,由你来计算fun(A)的结果.例如:A = {1, 4, 1},fun(A) = [5/4] + [

Java [Leetcode 303]Range Sum Query - Immutable

题目描述: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note: You may assume that the ar

LeetCode 303. Range Sum Query - Immutable

求数组nums[i,j]的和 思路:另开一sum数组,sum[i]为nums[0,i]的和,所以nums[i,j] = sum[j] - sum[i-1] 1 class NumArray { 2 public: 3 vector<int> sum; 4 NumArray(vector<int> &nums) { 5 sum.resize(nums.size(), 0); 6 sum[0] = nums[0]; 7 int len = nums.size(); 8 for(

【数组】Minimum Path Sum

题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路: 设res[i][j]表示从左上角到grid[i][

HDU 5586 Sum

最大子串和 #include<cstdio> #include<cstring> const int maxn=100000+10; int n; int x[maxn]; int fx[maxn]; int a[maxn]; int sum[maxn]; int L[maxn],R[maxn]; const int INF=0x7FFFFFFF; int max(int a,int b) { if(a>b) return a; return b; } int main()

leetcode笔记:Combination Sum III

一. 题目描述 Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers. Ensure that numbers within the set are sorted in ascending order. E