LeetCode 18 4sum 找出4个数,使得他们的和等于target

题目

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.
    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)

翻译:

给定一个整形数组,找出4个数字使得他们的和加起来等于target。

思路:

和3Sum差不多。遍历,保存当前,找到其余三个数值和为target - num[i],然后剩下在用3SUM思路去解决。

代码:

public class Solution {
    public static ArrayList<ArrayList<Integer>> fourSum(int[] nums, int target) {
		ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
		if(nums == null || nums.length < 4)
			return res;
		Arrays.sort(nums);
		for(int i = 0; i < nums.length -3;i++)
		{
			if(i > 0 && nums[i] == nums[i-1])
				continue;
			ArrayList<ArrayList<Integer>> cur = threeSum(nums,i+1,target-nums[i]); //得到当前数字可以组合出来的数字序列的子集。
            for(int j = 0 ;j < cur.size();j++)
                {
                    cur.get(j).add(0, nums[i]);

                }
            res.addAll(cur);
		}
		return res;
    }

	public static ArrayList<ArrayList<Integer>> threeSum(int[] num,int start,int target)
    {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(num == null||num.length<3)//如果只有2个数字 或者为空 返回空
            return res;
        //Arrays.sort(num);
        for(int i = start; i<num.length -2;i++)// 保证最后得有num.length-1 和num.length-2两个数,才可以进循环
        {
           if(i > start && num[i] == num[i-1])
				continue;
            ArrayList<ArrayList<Integer>> cur = twoSum(num,i+1,target-num[i]); //得到当前数字可以组合出来的数字序列的子集。
            res.addAll(cur);
        }  

        return res;
    }
    public static ArrayList<ArrayList<Integer>>twoSum (int []num,int start,int target)
    {  

        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(num == null||num.length < 2)
            return res;
        int l = start;//起始位置
        int pri = start-1;//当前数字
        int r = num.length-1;//终止位置
        while(l < r)//采用夹逼,逼近target
        {
            if(num[l]+num[r] == target)//
            {
                ArrayList<Integer> te = new ArrayList<Integer>();//符合的话 把三个数放入到list中
                te.add(num[pri]);
                te.add(num[l]);
                te.add(num[r]);
                res.add(te);
                int k = l + 1;//从l的下一个开始 去除重复。
                while(k < r&& num[k] == num[l])
                    k++;
                l = k;
                k = r - 1;//去除R的重复
                while(k > l &&num[k] == num[r])
                    k--;
                r = k;
            }
            else if(num[l] + num[r] > target)//夹逼
                r--;
            else l++;
        }  

        return res;  

    }
}

碰到的问题就是在提交的时候,[-2,0,1,-3]和[-3,-2,0,1]竟然不是一样的结果。

明明是一样的数组。后来才发现在

 for(int j = 0 ;j < cur.size();j++)
                {
                    cur.get(j).add(0, nums[i]);

                }
            res.addAll(cur);  

这个位置的时候,原来的写法是cur.get(j).add(nums[i]),后来改为上面的写法,把最小的数值插在最前面。

这样提交就OK了。

时间: 2024-10-14 03:00:11

LeetCode 18 4sum 找出4个数,使得他们的和等于target的相关文章

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,

LeetCode——18. 4Sum

一.题目链接:https://leetcode.com/problems/4sum/ 二.题目大意: 给定一个数组A和一个目标值target,要求从数组A中找出4个数来使之构成一个4元祖,使得这四个数的和等于target,找出所有的四元组,当然这些四元组不能有重复的. 三.题解: 这道题实质就是3sum的变形,关于4sum问题,已经在https://www.cnblogs.com/wangkundentisy/p/9079622.html这里说过了,无外乎最外面两层循环,最里面的循环使用哈希表或

[面试题]在数组中找出3个数使得它们和为0

给定一个数组S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1).注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑. 当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1). 参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给

有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的

1.问题 There are two int variables: a and b, don't use "if"."? :"."switch" or other judgement statement, find out the biggest one of the two numbers. (有两个变量a和b,不用"if"."? :"."switch"或其他判断语句,找出两个数中比较

【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数

// 给一组数,只有一个数只出现了一次,其他所有数都是成对出现的.找出这个数 #include <stdio.h> int find_one(int arr[], int len) { int i = 0; int ret = 0; for (; i < len; ++i) { ret ^= arr[i]; } return ret; } int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; printf("%d\n",

LeetCode 18 4Sum(4个数的和)

翻译 给定一个有n个数字的数组S,在S中是否存在元素a,b,c和d的和恰好满足a + b + c + d = target. 找出数组中所有的不想等的这四个元素,其和等于target. 备注: 在(a,b,c,d)中的元素必须从小到大排列.(a ≤ b ≤ c ≤ d) 其结果必须不能够重复. 例如,给定S = {1 0 -1 0 -2 2},target = 0. 一个结果集为: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2) 原文 Given an ar

LeetCode 15 3Sum 找出数组里面3个数的和等于指定值。

题目:Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) The so

【转】已知一个数出现的次数严格超过了一半,请用O(n)的复杂度的算法找出这个数

原文转自:http://blog.csdn.net/zhq651/article/details/7930284 方法1:既然过半,那么用这个数与其他数配对的话,剩余的数字一定还是过半的这个数字.因此可以通过不断删除不同的2个数,直到没有不同的2个数,那么这个数就是要找的数.证明:最坏情况下,只有这个数同别的数配对,并且被删除,剩下的仍旧是这个数,因此得证. 转自:http://www.cnblogs.com/python27/archive/2011/12/15/2289534.html 例:

LeetCode 18. 4Sum (四数之和)

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: The solution set must not contain duplicate quadruplets. For exampl