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)

思路:

讨论里有说O(N2)的解法,好像是分为两个2 Sum来做。没仔细看。

下面贴个常规O(n3)解法,注意去重。

vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> ans;
if(num.size() < ) return ans;
int l1, l2, l3, l4;
sort(num.begin(), num.end());
for(l1 = ; l1 < num.size() - ; l1++)
{
if(l1 > && num[l1] == num[l1 - ]) continue; //注意去重复方法 含义是在另外三个数字固定的情况下 同一位置的数字不能重复
for(l4 = num.size() - ; l4 >= l1 + ; l4--)
{
if(l4 < num.size() - && num[l4] == num[l4 + ]) continue;
l2 = l1 + ;
l3 = l4 - ;
while(l2 < l3)
{
if(num[l1]+num[l2]+num[l3]+num[l4] == target)
{
vector<int> partans;
partans.push_back(num[l1]);
partans.push_back(num[l2]);
partans.push_back(num[l3]);
partans.push_back(num[l4]);
ans.push_back(partans); l2++;
while(num[l2] == num[l2 - ])
{
l2++;
}
l3--;
while(num[l3] == num[l3 + ])
{
l3--;
}
}
else if(num[l1]+num[l2]+num[l3]+num[l4] < target)
{
l2++;
}
else
{
l3--;
}
}
}
}
return ans;
}

大神看起来更统一的代码:

public class Solution {
public List<List<Integer>> fourSum(int[] num, int target) {
List<List<Integer>> results = new LinkedList<List<Integer>>();
if (num == null || num.length < )
return results;
Arrays.sort(num); for (int s = ; s < num.length - ; s++) {
if (s > && num[s] == num[s - ]) continue; for (int e = num.length - ; e >= s + ; e--) {
if (e < num.length - && num[e] == num[e + ]) continue; int local = target - num[s] - num[e];
int j = s + ;
int k = e - ;
while (j < k) { if (j > s + && num[j] == num[j - ]) {
j++;
continue;
}
if (k < e - && num[k] == num[k + ]) {
k--;
continue;
} if ((num[j] + num[k]) > local)
k--;
else if ((num[j] + num[k]) < local)
j++;
else
results.add(new ArrayList<Integer>(Arrays.asList(
num[s], num[j++], num[k--], num[e])));
}
}
}
return results;
}
}

【leetcode】4Sum(middle)的更多相关文章

  1. 【leetcode】Candy(python)

    题目要求的比它的邻居比自己奖励,因此,我们有最少一个多的.所有我们可以找到所有的坑,凹坑例如,存在以下三种情况. 找到全部的凹点后,我们就能够从凹点处開始向左右两个方向依次查找递增序列.当中每一个高的 ...

  2. NoSQL之【MongoDB】学习(三):配置文件说明

    摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...

  3. 【操作系统】进程间通信(C#)

    原文:[操作系统]进程间通信(C#) 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xia ...

  4. 【Luogu3444】ORK-Ploughing(贪心)

    [Luogu3444]ORK-Ploughing(贪心) 题面 Luogu 题解 我们知道,如果我们选定了以横向为主,或者纵向为主, 那么就有尽可能减少另一个方向上耕地的次数 所以分开贪心,但是本质相 ...

  5. 【BZOJ1997】Planar(2-sat)

    [BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...

  6. 【Luogu1337】平衡点(模拟退火)

    [Luogu1337]平衡点(模拟退火) 题面 洛谷 题解 和BZOJ3680吊打XXX是一样的.. 但是数据很强呀.. 疯狂调参 各种WA... 很无奈呀.... #include<iostr ...

  7. 【BZOJ1996】合唱队(动态规划)

    [BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...

  8. 【BZOJ1899】午餐(动态规划)

    [BZOJ1899]午餐(动态规划) 题面 BZOJ 题解 我太弱了 这种\(dp\)完全做不动.. 首先,感性理解一些 如果所有人都要早点走, 那么,吃饭时间长的就先吃 吃饭时间短的就晚点吃 所以, ...

  9. 【BZOJ1040】骑士(动态规划)

    [BZOJ1040]骑士(动态规划) 题面 BZOJ 题解 对于每一组厌恶的关系 显然是连边操作 如果是一棵树的话 很显然的树型\(dp\) 但是,现在相当于有很多个基环 也就是在一棵树的基础上再加了 ...

随机推荐

  1. web安全实战

    前言 本章将主要介绍使用Node.js开发web应用可能面临的安全问题,读者通过阅读本章可以了解web安全的基本概念,并且通过各种防御措施抵御一些常规的恶意攻击,搭建一个安全的web站点. 在学习本章 ...

  2. 企业SAAS的春天,将以手机应用的形式,即将到来

    派尔科技吴春福 *本文是派尔为什么要投身企业移动应用的内部分享文章: *我没有仔细核查资料,仅代表个人看法,思路也是在整理过程,逻辑未必很完整,看官将就着看. 企业SAAS,概念起源是N年前,先行者也 ...

  3. Quartz.NET快速上手第一课(官网文档翻译)

    Quartz.NET快速上手第一课(官网文档翻译) 原文链接 在你使用调度者(scheduler)之前,你需要对它进行实例化(谁能猜到这呢?).在实例化scheduler时候,你需要使用ISchedu ...

  4. C++描述基础算法之直接插入排序

    由于此博文并不难,所以并不需要搬出C++特性的这些大山,所以就使用简单的C++代码描述了.^_^ 直接插入排序是一种简单的插入排序法,所以适用于少量数据的排序,直接插入排序是比较稳定的一种排序算法. ...

  5. CSS的引入方式

    再用HTML编写的文本中,有是没能达到我们想要的效果,此时此刻我们可以用过引用CSS来控制!这不仅使得效果好而且代码层次清晰.CSS的引入方式可以分为四类: 1.链入外部样式表,就是把样式表保存为一个 ...

  6. PHP利用微信跳转的Code参数获取用户的openid

    //获取微信登录用户信息function getOpenID($appid,$appsecret,$code){   $url="https://api.weixin.qq.com/sns/ ...

  7. iterm2 配色修改

    打开终端 输入 cd ~ vim .bash_profile 插入 export CLICOLOR= export LSCOLORS=gxfxcxdxbxegedabagacad export PS1 ...

  8. Spark Streaming揭秘 Day33 checkpoint的使用

    Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...

  9. java-----基本数据类型包装类

    目的:为了方便操作基本数据类型值,将其封装为对象,在对象定义了属性和行为,丰富了改数据的操作,用于描述该对象的类也就成为基本数据类型对象包装类. 例如:int类型的取值范围:Integer------ ...

  10. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...