[LeetCode][Java] 4Sum

原创 2015年07月09日 20:25:23

题目:

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)

题意:

给定一个包含n个整数的数组S,在数组S中是否存在元素a,b,c和d,使得 a + b + c + d = target.找出数组S中所有这样的组合。

注意:

1.这四个元素必须是升序排列(ie, a ≤ b ≤ c ≤ d)

2.最终结果中不嫩包含重复的解。

    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)

算法分析:

 * 利用了题目《3Sum》的代码 https://leetcode.com/problems/3sum/
 * 首先升序排列数组,然后从第一个元素开始依次遍历《3Sum》算法,目标值为(target-nums[i]),遍历的数组为该元素后面的数组
 * 这样既满足最终的arraylist中元素升序排列,也不会出现重复,因为每次以其为开始,进行遍历的元素都是数组中的最小的元素

AC代码:

public class Solution 
{
    private static ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();
    
    public ArrayList<ArrayList<Integer>> fourSum(int[] nums, int target) 
    {
        int newtarget=0;
    
        ArrayList<ArrayList<Integer>> finalres = new ArrayList<ArrayList<Integer>>();
        Arrays.sort(nums);
    	for (int i = 0; i < nums.length; i++) 
        {
    		 ArrayList<ArrayList<Integer>> temlist= new ArrayList<ArrayList<Integer>>();
    		if (i > 0 && nums[i] == nums[i-1]) continue;//避免结果重复,其后面和它相等的直接被跳过。
            newtarget=target-nums[i];
            int inputnums[]=new int[nums.length -i-1];
            for(int ii=0;ii<nums.length -i-1;ii++)
            	inputnums[ii]=nums[ii+1+i];//每次选取该元素后面的数组作为《3sum》算法的输入数组
            temlist=threeSum(inputnums,newtarget,nums[i]);
           
            finalres.addAll(temlist);
            ret.clear();
        }
		return finalres;
		
    }
    public static ArrayList<ArrayList<Integer>> threeSum(int[] num,int newtarget,int firstnum) 
    {
        if (num == null || num.length < 3) return ret;
        
        Arrays.sort(num);
        
        int len = num.length;
        for (int i = 0; i < len-2; i++) 
        {
            if (i > 0 && num[i] == num[i-1]) continue;//避免结果重复,其后面和它相等的直接被跳过。
            find(num, i+1, len-1, num[i],newtarget, firstnum); //寻找两个数与num[i]的和为0
        }
        
        return ret;
    }
    
    public static void find(int[] num, int begin, int end, int target,int newtarget,int firstnum) 
    {
        int l = begin, r = end;
        while (l < r)
        {
            if (num[l] + num[r] + target == newtarget) 
            {
                ArrayList<Integer> ans = new ArrayList<Integer>();
                ans.add(firstnum);//与原始的《3Sum》算法不同的地方为:记得把每次的启示遍历元素加入进去,就是4个数中的最小的那一个
                ans.add(target);
                ans.add(num[l]);
                ans.add(num[r]);
                ret.add(ans); //放入结果集中
                while (l < r && num[l] == num[l+1]) l++;//避免结果重复,其后面和它相等的直接被跳过。
                while (l < r && num[r] == num[r-1]) r--;////避免结果重复,其后面和它相等的直接被跳过。
                l++;
                r--;
            } 
            else if (num[l] + num[r] + target < newtarget) 
                l++;
            else 
                r--;
        }
    }
}


版权声明:本文为博主原创文章,转载注明出处

【LeetCode-面试算法经典-Java实现】【018-4Sum(四个数的和)】

【018-4Sum(四个数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given an array S of n integers, are there ele...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月22日 07:22
  • 2407

Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先,这是一道远古之前的题的进化版: Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了,因为我也记不住了。。这道题意思就是ABCD四个数组,长...
  • MebiuW
  • MebiuW
  • 2016年11月16日 22:45
  • 2748

LeetCodet题解--18. 4Sum(4个数的和)

====#链接 LeetCode题目:https://leetcode.com/problems/4sum GitHub代码:https://github.com/gatieme/Lee...
  • gatieme
  • gatieme
  • 2016年04月07日 21:09
  • 1402

LeetCode : 4Sum [java]

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = t...
  • hackeraaa
  • hackeraaa
  • 2016年03月07日 10:42
  • 134

4Sum leetCode Java

4Sum-leetCode-Java题目描述Given an array S of n integers, are there elements a, b, c, and d in S such th...
  • taxueguilai1992
  • taxueguilai1992
  • 2015年05月08日 20:11
  • 320

LeetCode – 4Sum (Java)

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar...
  • whywhom
  • whywhom
  • 2014年04月24日 13:10
  • 338

LeetCode 18 4Sum (C,C++,Java,Python)

Problem: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b...
  • runningtortoises
  • runningtortoises
  • 2015年05月10日 15:04
  • 1315

LeetCode – 4Sum (Java)题解

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar...
  • Ying_Xu
  • Ying_Xu
  • 2016年03月20日 17:33
  • 695

[LeetCode] 018. 4Sum (Medium) (C++/Java/Python)

[LeetCode] 018. 4Sum (Medium) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015年03月04日 17:57
  • 2893

算法分析与设计——LeetCode Problem.18 4Sum

题目链接 问题描述 Given an array S of n integers, are there elements a, b, c, and d in S such ...
  • SYSU_Chan
  • SYSU_Chan
  • 2017年12月28日 22:58
  • 43
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode][Java] 4Sum
举报原因:
原因补充:

(最多只允许输入30个字)