题意:这是继2sum和3sum之后的4sum,同理,也是找到所有4个元素序列,满足他们之和为target。以vector<vector<int>>来返回,也就是二维的,列长为4,有多少个序列就多少行,每行都是唯一的,且升序。

思路:

方法一:用类似3sum的方法,先确定下第1个元素,再确定第2个元素,剩下两个元素用“两个指针”。前提是已排序。这个方法主要是怎么去重,这里提供两种方法:

1)用unordered_set,只要找到一个序列就检查里面有没有这样的序列,若没有就插入,这样保证了唯一性,最后再用迭代器遍历一次,逐个搬到vector中返回。

2)这是我用的方法。假设有序列 a{-2,-2,-2,-1,-1,0,0,1,1,2,2  }共11个元素,target=0。

  第1个元素取a[0],第2个元素取a[1],那么>1的所有两个数的组合会被“两个指针”所全部找到,而如果有重复的,都会是连续的重复,所以只要判断与上一个序列之中有一个值不同,就可以进行插入。(“两个指针”处的去重)

  接下来第2个元素会取a[2],但是a[1]=a[2],还有必要再试吗?不必要,看{-2,-2,a,b}=target,这里a和b已经将所有可能给试了,如果这此仍取a[2],那么仍然在试集合{-2,-2,a,b}中的a和b的值而已。这下如果重复了,就不一定会连续的重复了(可以自己列出),去重就麻烦了。所以第2个元素必须跳过已经扫过的值,也就是无论还有几个-2,直接跳过到-1。(第2个元素处的去重)

  第1个元素要取a[1]开始试吗?不用!道理同第2个元素的去重一样。所有以第1个元素为-2的序列已经都试出来了,再取-2也只是再找重复的序列,而且不是连续的。

 class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
sort(num.begin(), num.end()); //排序
vector<int> group(,);
vector< vector<int> > ans;
int n=num.size(), sum, sum2, *pl, *pr, old1=,old2=- ;//这里的old可以随便取值,特殊一点的都行
for(int j=; j<n-; j++ ) //第1个元素
{
if(old1==num[j]) continue; else old1=num[j];
for(int i=j+; i<n-; i++ )//第2个元素
{
if(old2==num[i]) continue; else old2=num[i];
sum2 = target-num[i]-num[j] ;//寻找余下两数之和
pl = &num[i+];//左指针
pr = &num[n-];//右指针
while(pl!=pr)
{
sum = *pl + *pr;
if( sum == sum2 )
{
if( group[]!=num[j] || group[]!=num[i] || group[]!=*pl || group[]!=*pr )//只要有一个不同,便可添加
{
group[] = num[j];
group[] = num[i];
group[] = *pl;
group[] = *pr;
ans.push_back(group);
}
pl++;
}
else if( sum > sum2 ) pr--;
else pl++;
}
}
old2=;
}
return ans;
}
};

4Sum

  

方法二:将序列中两两的和作为新的序列,那问题就转化为“求两个值的和”,也就是用“两个指针”法。这里的难点在于,找到和为target的新序列中的两个元素,如何找到他们原来的面目(4个元素)。还有个问题,元素会被你重复的利用。

比如,有序列a{-1,-1,0,1,1},

转成新序列{-2,-1,0,0,-1,0,0,1,,2},

新序列是这么来的{-1+-1,-1+0,-1+1,-1+1,-1+0,-1+1,-1+1,0+1,0+1,1+1},

也就是{a[0]+a[1],a[0]+a[2], a[0]+a[3],a[0]+a[4] ,a[1]+a[2],a[1]+a[3],a[1]+a[4],a[2]+a[3],a[2]+a[4],a[3]+a[4]}。

假如target=0,我们在新序列中找到 -1+1=0,但是他们是a[0]+a[2]+a[2]+a[4]。也就是说,a[2]被算了两次了,是不允许的。

此方法还未实现,有空再想。

LeetCode 4Sum 4个数之和的更多相关文章

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

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

  3. 【LeetCode】18. 4Sum 四数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:four sum, 4sum, 四数之和,题解,leet ...

  4. LeetCode 16 3Sum Closest (最接近target的3个数之和)

    题目链接 https://leetcode.com/problems/3sum-closest/?tab=Description     Problem : 找到给定数组中a+b+c 最接近targe ...

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

  6. 18 4Sum(寻找四个数之和为指定数的集合Medium)

    题目意思:给一个乱序数组,在里面寻找三个数之和为target的所有情况,这些情况不能重复,增序排列 思路:采用3Sum的做法 ps:有见一种用hash的,存任意两个元素的和,然后变成3sum问题,需要 ...

  7. [LeetCode] 3Sum 三数之和

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  8. LeetCode——4Sum &amp; 总结

    LeetCode--4Sum & 总结 前言 有人对 Leetcode 上 2Sum,3Sum,4Sum,K Sum问题作了总结: http://blog.csdn.net/nanjunxia ...

  9. LeetCode:三数之和【15】

    LeetCode:三数之和[15] 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的 ...

随机推荐

  1. 第三周作业-课本&&视频学习

    <网络攻防技术与实践>第三周作业 Part I 寻找自己留在互联网上的足迹并消除隐私 1.1 google/baidu搜索自己的qq号 搜索结果如图,搜到的有用信息其实就是图上这么几条,能 ...

  2. redis系列:redis介绍与安装

    前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟 ...

  3. Flask 入门(第一篇)

    1. 认识 Flask Flask 是一个微型 Web 框架,依赖于 jinjia2 模板系统和 Werkzeug WSGI(本质为 Socket 服务端) 服务,默认情况不支持数据库抽象层.表单验证 ...

  4. Unity 中动态修改碰撞框(位置,大小,方向)

    在Unity中,玩家处于不同的状态,要求的碰撞框的 位置/大小/方向 会有所改变,怎么动态的修改碰撞框呢? 下面是Capsure Collider(胶囊体)的修改: CapsuleCollider.d ...

  5. GTK+学习笔记(一)

    你将学到什么 如何实现弹出式菜单 菜单简介 菜单(GtkMenu)由菜单项(GtkMenuItem)构成,菜单项可以是任意构件比如按钮.菜单(子菜单) 菜单项的管理 菜单外壳(GtkMenuShell ...

  6. SAS笔记(7) PROC SQL

    参考资料:<Longitudinal Data and SAS: A Programmer's Guide>

  7. Wannafly summer camp Day2I(思维)

    #include<bits/stdc++.h>using namespace std;int a[1000007],b[1000007],c[1000007];int find_max(i ...

  8. 水库(树形dp)

    水库 (树形dp) R国有n座城市和n-1条长度为1的双向道路,每条双向道路连接两座城市,城市之间均相互连通.现在你需要维护R国的供水系统.你可以在一些城市修建水库,在第i个城市修建水库需要每年c_i ...

  9. shell括号和linux算术运算

    一.小括号() 1. 单小括号() a).命令组 (a=0;touch a.txt) 小括号中的内容会开启一个子shell独立运行:括号中以分号连接,最后一个命令不需要:各命令和括号无空格 b).命令 ...

  10. oracle odbc连接sqlserver 无法查询字段

    最近因项目需要,需要在oracle数据库里面通过DBLINK方式链接SQLserver数据库(oracle 11G,Sqlserver2016,具体实现参考链接 http://blog.sina.co ...