【leetcode】4Sum(middle)
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)
思路:
讨论里有说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)的更多相关文章
- 【leetcode】Candy(python)
		
题目要求的比它的邻居比自己奖励,因此,我们有最少一个多的.所有我们可以找到所有的坑,凹坑例如,存在以下三种情况. 找到全部的凹点后,我们就能够从凹点处開始向左右两个方向依次查找递增序列.当中每一个高的 ...
 - NoSQL之【MongoDB】学习(三):配置文件说明
		
摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...
 - 【操作系统】进程间通信(C#)
		
原文:[操作系统]进程间通信(C#) 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xia ...
 - 【Luogu3444】ORK-Ploughing(贪心)
		
[Luogu3444]ORK-Ploughing(贪心) 题面 Luogu 题解 我们知道,如果我们选定了以横向为主,或者纵向为主, 那么就有尽可能减少另一个方向上耕地的次数 所以分开贪心,但是本质相 ...
 - 【BZOJ1997】Planar(2-sat)
		
[BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...
 - 【Luogu1337】平衡点(模拟退火)
		
[Luogu1337]平衡点(模拟退火) 题面 洛谷 题解 和BZOJ3680吊打XXX是一样的.. 但是数据很强呀.. 疯狂调参 各种WA... 很无奈呀.... #include<iostr ...
 - 【BZOJ1996】合唱队(动态规划)
		
[BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...
 - 【BZOJ1899】午餐(动态规划)
		
[BZOJ1899]午餐(动态规划) 题面 BZOJ 题解 我太弱了 这种\(dp\)完全做不动.. 首先,感性理解一些 如果所有人都要早点走, 那么,吃饭时间长的就先吃 吃饭时间短的就晚点吃 所以, ...
 - 【BZOJ1040】骑士(动态规划)
		
[BZOJ1040]骑士(动态规划) 题面 BZOJ 题解 对于每一组厌恶的关系 显然是连边操作 如果是一棵树的话 很显然的树型\(dp\) 但是,现在相当于有很多个基环 也就是在一棵树的基础上再加了 ...
 
随机推荐
- 第一个Apple Watch小例子
			
原文在这, 不过他说的add target按照他的说法还真没找到(估计是我的眼瞎了或者是版本不一样),还有就是好记性不如烂博客,先自己能看懂就行了. 请用Single View Application ...
 - c# DataGridView操作
			
#region 操作DataGridView /// <summary> /// 初始化DataGridView属性 /// </summary> /// <param ...
 - C# @符号的多种使用方法
			
1.限定字符串用 @ 符号加在字符串前面表示其中的转义字符“不”被处理.如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下:str ...
 - 最小化Spring XML配置
			
Spring提供两种技巧,可以帮助我们减少XML的配置数量. 1.自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg&g ...
 - ALI OSS RequestTimeTooSkewed
			
php版阿里oss sdk,请求时抛RequestTimeTooSkewed错误,说时间差距太大,搜了一下发现是服务器的时间设置问题. 我们在安装完Centos Linux操作系统之后,点击系统的时间 ...
 - 滑动选择日期(基于sui-mobile的移动端)
			
$(page).on('touchmove','#touchMoveTime',function (event) { touchMove(event); }); scrollBarInit(); // ...
 - 译文:Javascript-function's return
			
个人理解+google翻译.如有错误,请指正.原文来自MDN:return 概要 由function返回指定值. 版本信息 实现: JavaScript 1.0, NES 2.0(NES:游戏机在欧洲 ...
 - C# SocketHelper 源码
			
玄机论坛Socket类库源码+Demo 本类库采用C# TcpLister,TcpClient高度封装,采用C# NetworkStream进行异步模式读取数据.采用C# Semaphore来进行并发 ...
 - Laravel Homestead安装教程
			
1/先在https://www.vagrantup.com 下载vagrantup ,对应平台下载,并安装,安装后可以在命令行使用vagrant https://www.vagrantup.com/ ...
 - php session学习笔记(实例代码)
			
http 无状态协议 一个服务器向客户端发送消息的时候有三条信息 一是状态二是头信息三是内容 会话控制 让一个用户访问每个页面,服务器都知道是哪个用户访问 cookie cookie是通过头信息发送 ...