Question

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.
  1. For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
  2.  
  3. A solution set is:
  4. (-1, 0, 0, 1)
  5. (-2, -1, 1, 2)
  6. (-2, 0, 0, 2)

Solution

我们可以follow 3Sum的思路完成4Sum。

这里给出average time小于O(n3)的方法。

我们可以把4Sum拆解为2Sum的问题。首先,构造map,key为pair sum,value为list of pairs。然后,照着2Sum的方法,得出结果。

  1. public class Solution {
  2. public List<List<Integer>> fourSum(int[] nums, int target) {
  3. Arrays.sort(nums);
  4. Map<Integer, List<List<Integer>>> map = new HashMap<Integer, List<List<Integer>>>();
  5. Set<List<Integer>> result = new HashSet<List<Integer>>();
  6. for (int i = 0; i < nums.length; i++) {
  7. for (int j = i + 1; j < nums.length; j++) {
  8. int sum = nums[i] + nums[j];
  9. if (map.containsKey(target - sum)) {
  10. List<List<Integer>> pairs = map.get(target - sum);
  11. for (List<Integer> pair : pairs) {
  12. // m1 < m2
  13. int m1 = pair.get(0);
  14. int m2 = pair.get(1);
  15. // m3 < m4
  16. int m3 = i;
  17. int m4 = j;
  18. if (m1 == m3 || m1 == m4 || m2 == m3 || m2 == m4) {
  19. continue;
  20. } else {
  21. if (m2 < m3) {
  22. result.add(Arrays.asList(nums[m1], nums[m2], nums[m3], nums[m4]));
  23. } else if (m2 > m4) {
  24. result.add(Arrays.asList(nums[m1], nums[m3], nums[m4], nums[m2]));
  25. } else {
  26. result.add(Arrays.asList(nums[m1], nums[m3], nums[m2], nums[m4]));
  27. }
  28. }
  29. }
  30. }
  31. // Add current pair into map
  32. List<Integer> list = new ArrayList<Integer>();
  33. list.add(i);
  34. list.add(j);
  35. if (map.containsKey(sum)) {
  36. map.get(sum).add(list);
  37. } else {
  38. List<List<Integer>> tmp2 = new ArrayList<Lis<Integer>>();
  39. tmp2.add(list);
  40. map.put(sum, tmp2);
  41. }
  42.  
  43. }
  44. }
  45. return new ArrayList<List<Integer>>(result);
  46. }
  47. }

4Sum 解答的更多相关文章

  1. leetcode — 4sum

    import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Source : https://oj.l ...

  2. LeetCode题目解答

    LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...

  3. LeetCode算法题目解答汇总(转自四火的唠叨)

    LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...

  4. [LeetCode] 4Sum II 四数之和之二

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

  5. [LeetCode] 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 ...

  6. 精选30道Java笔试题解答

    转自:http://www.cnblogs.com/lanxuezaipiao/p/3371224.html 都 是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我 ...

  7. 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...

  8. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  9. spring-stutrs求解答

    这里贴上applicationContext里的代码: <?xml version="1.0" encoding="UTF-8"?> <bea ...

随机推荐

  1. 为什么新建的管理员账号权限没有Administrator大?

    Administrator是超级管理员,UAC不用确认,跟关了一样. 新建隶属于administrator组的用户,可以关掉UAC. 控制面板>系统和安全>操作中心>更改用户帐户控制 ...

  2. Quartz集成springMVC 的方案二(持久化任务、集群和分布式)

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等. Quartz核心是调度器,还采用多线程管理. 1.持久化任务:当应用程序停止运行时,所有调度信 ...

  3. C++中的重载、覆盖、隐藏

    前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪.引用的 ...

  4. pyqt搜索指定信息 github处找到,谢谢这位朋友的帮助了

    def tabunqi(self,text):    #第一遍添加之后,不提示,当第二次添加相同的数据时,就提示下    text1=str(text)    items = self.downwid ...

  5. spark1.3的部署

    1.下载源码,根据自己的环境编译,我这里下载的是spark1.3版本 本人采用sbt编译, SPARK_HADOOP_VERSION=2.5.2 SPARK_YARN=ture sbt/sbt ass ...

  6. Java IO教程 导读

    Java IO是一套java 用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并有输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类 ...

  7. (转)iOS7界面设计规范(2) - UI基础 - iOS应用解析

    今天再来一发,然后结束掉周六的忙碌,去吃零食,还有冰啤酒:其实现在打嗝还有小龙虾味儿呢. 第二篇更多的是从技术的角度对iOS界面组成原理进行了简单的解析,篇幅很短,可稍作了解:更多关于iOS开发入门的 ...

  8. [置顶] Android安全机制分析

    Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...

  9. [Regular Expressions] Find Repeated Patterns

    Regular Expression Quantifiers allow us to identify a repeating sequence of characters of minimum an ...

  10. MongoDB 和 mySql 的关系

    1. mysql 和 MongoDb MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库. ...