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)
Solution 1:
public List<List<Integer>> fourSum(int[] num, int target) { List<List<Integer>> result = new ArrayList<>(); int len = num.length; if(len < 4) return result; Arrays.sort(num); for(int i=0; i<len-3; i++) { if(i>0 && num[i]==num[i-1]) continue; for(int j=i+1; j<len-2; j++) { if(j>i+1 && num[j]==num[j-1]) continue; int start = j+1; int end = len-1; while(start < end) { int sum = num[i]+num[j]+num[start]+num[end]; if(sum == target) { List<Integer> quadruplet = new ArrayList<>(); quadruplet.add(num[i]); quadruplet.add(num[j]); quadruplet.add(num[start]); quadruplet.add(num[end]); result.add(quadruplet); do { start++; }while(start < end && num[start] == num[start-1]); do { end--; }while(start < end && num[end] == num[end+1]); } else if(sum < target) { start++; } else { end--; } } } } return result; }
Solution 2:
public List<List<Integer>> fourSum(int[] num, int target) { // Since we use set here, we don't need to dedup data Set<List<Integer>> result = new HashSet<>(); Arrays.sort(num); Map<Integer, Set<Pair>> map = new HashMap<>(); for (int i=0; i<num.length; i++) { for (int j=0; j<i-1; j++) { int a = num[j], b = num[i-1]; if (!map.containsKey(a+b)) { map.put(a+b, new HashSet()); } map.get(a+b).add(new Pair(a, b)); } // Note the order of these two for-loops is critical for (int j=i+1; j<num.length; j++) { int pairSum = target - num[i] - num[j]; if (map.containsKey(pairSum)) { for (Pair p : map.get(pairSum)) { List l = new LinkedList(); l.add(p.first); l.add(p.second); l.add(num[i]); l.add(num[j]); result.add(l); } } } } return new ArrayList<List<Integer>>(result); } class Pair { int first; int second; public Pair(int first, int second) { this.first = first; this.second = second; } @Override public int hashCode() { return first*31 + second; } @Override public boolean equals(Object d){ if (d == this) return true; if (!(d instanceof Pair)) return false; Pair p = (Pair) d; return (this.first == p.first) && (this.second == p.second); } }
Reference:
相关推荐
js js_leetcode题解之18-4sum.js
java java_leetcode-112-path-sum
java java_leetcode-113-path-sumII
本书名为《LeetCode 101 - A LeetCode Grinding Guide (C++ Version)》,是由作者高畅(Chang Gao)撰写的一本面向具有C++编程基础但缺乏刷题经验读者的教科书和工具书。本书的初衷是为了帮助读者系统性地归纳和总结...
c c语言_leetcode 0001_two_sum
c c语言_leetcode 0016_three_sum_closest.zip
c c语言_leetcode 0018_four_sum.zip
c c语言_leetcode 0015_three_sum.zip
LeetCode -- Path Sum III分析及实现方法 Path Sum III是LeetCode中的一个经典问题,旨在计算给定二叉树中所有路径的和等于某个给定值的路径数量。下面我们将详细介绍Path Sum III的分析及实现方法。 一、问题描述...
leetcode 2 leetcode-训练 算法训练。 java $: javac hello.java java $: java hello c $: gcc hello.c 如果没有错误会生成a.out 可执行文件 c $: ./a.out leetcode cli leetcode version leetcode help leetcode ...
c语言入门 c语言_leetcode题解01-two-sum.c
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...'[3,2,4]\n7' Submit final solution! $ leetcode submit ./two-sum.cpp
leetcode 接口 该项目可帮助您使用首选的 IDE 或带有命令行界面 (CLI) 的编辑器来执行 ...two-sum leetcode --name add-two-numbers leetcode --name median-of-two-sorted-arrays 然后问题描述和启动代码将自动
在双指针部分,作者解释了双指针技术在处理数组或链表问题时如何发挥作用,例如在TwoSum问题中的应用。在动态规划章节中,作者不仅介绍了动态规划的基本原理,还涵盖了不同类型的动态规划问题,如分割类型题、子序列...
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...'[3,2,4]\n7' Submit final solution! $ leetcode submit ./two-sum.cpp
4. Solution Word Break 单词断词是一个自然语言处理问题,要求将字符串断词为单词。可以使用动态规划或Trie树来解决该问题。 5. Word Break II 单词断词II是一个变体的问题,要求将字符串断词为单词,并且可以...
leetcode 答案 leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。 :SOS_button: 在 ...利用自动补全、类型检查......Sum " , inputs : [([ 2 , 7
c语言入门 C语言_leetcode题解之15-3sum.c
js js_leetcode题解之16-3sum-closest.js