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: 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]
]

解法1:

  在 3Sum 的基础上再加一层循环即可,3Sum 时间复杂度为 O(n2),所以这个方法时间复杂度为 O(n3)。

public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
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;
} int sum3 = target - nums[i]; // 后3个数之和需等于sum3
for (int j = i + 1; j < nums.length - 2; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) {
continue;
} int sum2 = sum3 - nums[j]; // 后2个数之和需等于sum3
int left = j + 1, right = nums.length - 1; while (left < right) {
if (nums[left] + nums[right] == sum2) {
List<Integer> quad = new ArrayList<>();
quad.add(nums[i]);
quad.add(nums[j]);
quad.add(nums[left]);
quad.add(nums[right]);
res.add(quad); while (left < right && nums[left++] == nums[left]) {}
while (left < right && nums[right--] == nums[right]) {} } else if (nums[left] + nums[right] < sum2) {
while (left < right && nums[left++] == nums[left]) {} } else {
while (left < right && nums[right--] == nums[right]) {}
}
}
}
}
return res;
}
}

解法2:

  先排序 (O(nlogn)),然后遍历整个数组,以每两个数的和作为key将两个数的index存于HashMap中,由于存在和相同的情况,因此HashMap中的每个键对应的是一个List,每个List中保存着多组index对,这一操作时间复杂度为 (O(n2))。

  遍历每个key,计算出需要满足4Sum为target的另外一个2Sum,两个2Sum对应的List分别为listA和listB,遍历其中的每一组index,分别为[a0, a1] 和 [b0, b1]。为避免找到index重复的结果,只寻找满足 a0 < b0, a0 < b1, a1 < b0, a1 < b1 的结果,而因为本身就有 a0 < a1, b0 < b1,所以只需满足 a1 < b0 即可。判断找到的结果是否已存在,不存在再把结果加到res中。这一操作比较复杂,时间复杂度不好算,据说是(O(n2logn)),但LeetCode给出的结果是超时。。。。

public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length < 4) {
return res;
} Arrays.sort(nums); HashMap<Integer, List<Integer[]>> map = new HashMap<>();
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
int sum = nums[i] + nums[j];
Integer[] pair = {i, j}; if (!map.containsKey(sum)) {
map.put(sum, new ArrayList<Integer[]>());
}
map.get(sum).add(pair);
}
} Set<Integer> keys = map.keySet();
for (int key : keys) {
List<Integer[]> listA = map.get(key);
List<Integer[]> listB = map.get(target - key); if (listA != null && listB != null) {
for (Integer[] pairA : listA) {
int a0 = pairA[0], a1 = pairA[1]; for (Integer[] pairB : listB) {
int b0 = pairB[0], b1 = pairB[1];
if (a1 < b0) { // 因为肯定存在: a0 < a1, b0 < b1
List<Integer> list = new ArrayList<>();
list.add(nums[a0]);
list.add(nums[a1]);
list.add(nums[b0]);
list.add(nums[b1]);
if (!res.contains(list)) res.add(list);
}
}
}
}
} return res;
}
}

[LeetCode] 18. 4Sum ☆☆的更多相关文章

  1. [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 ...

  2. LeetCode——18. 4Sum

    一.题目链接:https://leetcode.com/problems/4sum/ 二.题目大意: 给定一个数组A和一个目标值target,要求从数组A中找出4个数来使之构成一个4元祖,使得这四个数 ...

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

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

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

  5. leetcode 15 3sum & leetcode 18 4sum

    3sum: 1 class Solution { public: vector<vector<int>> threeSum(vector<int>& num ...

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

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

  8. C#解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 nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

随机推荐

  1. Python3 Tkinter-Scale

    1.创建 from tkinter import * root=Tk() Scale(root).pack() root.mainloop() 2.参数 from tkinter import * r ...

  2. Thunder团队第一周 - Scrum会议3

    Scrum会议3 小组名称:Thunder 项目名称:在线考试系统 Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李 ...

  3. linux下php环境配置

    参: http://www.laozuo.org/5542.html LAMP,基于Linux/Apache/MySQL/PHP架构的网站建设环境,对于一般的网站来说足够使用,如果我们的网站访问量或者 ...

  4. LintCode-56.两数之和

    两数之和 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1 到 n, ...

  5. Debian常用软件

    1. 有道词典 https://github.com/justzx2011/openyoudao

  6. js实现倒计时60秒的简单代码

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  7. C# 中的 Async 和 Await

    这篇文章由Filip Ekberg为DNC杂志编写. 自跟随着.NET 4.5 及Visual Studio 2012的C# 5.0起,我们能够使用涉及到async和await关键字的新的异步模式.有 ...

  8. [STAThread] 作用

    [STAThread]是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA. [STAThread]是声明开始线程用 ...

  9. linux后台运行之screen和nohup

    3.1 nohup命令 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令. 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程. nohup就是不挂起的意 ...

  10. Angular-Cli中引用第三方库

    最近在学习angular(AngularJS 2),根据教程使用angular-cli新建项目, 然而在添加JQuery和Bootstrap第三方库时遇到了问题... 初试 我最初的想法是直接将相对路 ...