题目:

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)

题意:

给定一个包括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] 4Sum的更多相关文章

  1. [LeetCode] 454. 4Sum II 四数之和II

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  2. N-Queens II leetcode java

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  3. leetcode 日记 4sum java

    整体思路同之前的一样,依然采取降低维度的方式进行 public List<List<Integer>> solution(int nums[], int target) { L ...

  4. 【JAVA、C++】LeetCode 018 4Sum

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  5. Java [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 ...

  6. leetcode 18 4Sum JAVA

    题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出 ...

  7. LeetCode 18 4Sum (4个数字之和等于target)

    题目链接 https://leetcode.com/problems/4sum/?tab=Description 找到数组中满足 a+b+c+d=0的所有组合,要求不重复. Basic idea is ...

  8. [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 = tar ...

  9. 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 = tar ...

随机推荐

  1. TCP/IP和UDP的比较

    TCP.UDP详解 1.传输层存在的必要性 由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态.因此有必要增强网络层提供服务的服务质量. 2.引入传输层的原因 面向 ...

  2. JS高级——文件操作

    https://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/12/2208589.html https://blog.csdn.net/pl16 ...

  3. Fiddler——抓包工具的使用

    fiddler安装 pc端安装fiddler,自行从百度下载即可 Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输 ...

  4. TI 77GHZ雷达开发套件 RDP-DC100

                                        RDP-DC100用户使用手册           目录 1.      硬件说明... 3 1.1.      官方处理板的修 ...

  5. canvas一周一练 -- canvas绘制立体文字(2)

    运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...

  6. 微信小程序 客服自动回复图片

    产品需求是,在客服对话框里,发送特定的文字,回复我们的二维码: 小城程开发完成后,这个自动回复图片的功能就摆在了眼前.刚开始我们想到的是:在线客服功能的设置里设置好自动回复的图片,但是目前设置不支持自 ...

  7. ubuntu root用户登陆

    sudo vi /etc/lightdm/lightdm.conf   (如果没有该文件则创建,内容如下) [SeatDefaults] user-session=ubuntu greeter-ses ...

  8. mac下用crontab实现pytho3脚本自动定期执行,包括scrapy的定期执行

    呃 其实要明天上午才能知道是否成功,毕竟改了一个小参数的. 首先,来学两个小命令: step1: $ sudo crontab -e step2: # 然后提示password输入密码,即可进入编辑页 ...

  9. 51NOD 1385凑数字(找规律?)

    >>点击进入原题测试<< 思路:这个题是真的想了蛮久,枚举了一下前一百就发现了规律,要想最短的话就是要构建1234567890这个字符串:刚开始找到的规律从1开始枚举到N,每满 ...

  10. Maven_在Eclipse中执行Maven命令