第一题是Two Sum

同样是用哈希表来做,需要注意的是在查打gap是要排除本身。比如target为4,有一个值为2,gap同样为2。

 vector<int> twoSum(vector<int> &num, int target)
{
unordered_map<int, int> mapping;
vector<int> result;
for (int i = ; i < num.size(); i++)
mapping[num[i]] = i; for (int i = ; i < num.size(); i++)
{
int gap = target - num[i];
//第二个判断条件更准确的是mapping[gap]!=i,防止选到自身
if (mapping.find(gap) != mapping.end()&&mapping[gap]>i)
{
result.push_back(i + );
result.push_back(mapping[gap] + );
break;
}
} return result;
}

接下来是3Sum

这题需要注意的是如何去重

vector<vector<int>> threeSum(vector<int> &num)
{
vector<vector<int>>result;
if (num.size() < )return; sort(num.begin(), num.end());
auto last = num.end();//最后一个元素的下一个
for (auto i = num.begin(); i < last - ; i++)
{
auto j = i + ;
//注意重复的判断
if (i>num.begin() && *(i) == *(i - ))continue;
auto k = last - ;
while (j < k)
{
if (*(i)+*(j)+*(k) < )
{
j++;
while (*(j) == *(j - ) && j < k)j++;
}
else if (*(i)+*(j)+*(k) > )
{
k--;
while (*(k) == *(k +) && k>j)k--;
}
else
{
result.push_back({*(i),*(j),*(k)});
j++;
k--;
while (*(j) == *(j - ) && j < k)j++;
while (*(k) == *(k + ) && k>j)k--;
}
}
}
return result;
}

接下来是3Sum Closet,和上题思路一样,代码中我没有去重,实际上应该要去重。

int threeSumCloset(vector<int>&num, int target)
{
int result = ;
int min_gap = INT_MIN; sort(num.begin(), num.end());
for (auto a = num.begin(); a != prev(num.end(), ); a++)
{
auto b = next(a);
auto c = prev(num.end()); while (b < c)
{
int sum = *(a)+*(b)+*(c);
int gap = abs(sum - target); if (gap < min_gap)
{
result = sum;
min_gap = gap;
} if (sum < target)b++;
else c--;
}
} return result;
}

4Sum采用相同的思路,不过它的去重放在了最后。需要注意去重的方法,unique并非真的去掉了重复元素,而是将重复元素放在了最后,unique返回的也是

重复元素开始时的迭代器。

vector<vector<int>> fourSum(vector<int>& num, int target) {
vector<vector<int>> result;
if (num.size() < ) return result;
sort(num.begin(), num.end());
auto last = num.end();
for (auto a = num.begin(); a < prev(last, ); ++a) {
for (auto b = next(a); b < prev(last, ); ++b) {
auto c = next(b);
auto d = prev(last);
while (c < d) {
if (*a + *b + *c + *d < target) {
++c;} else if (*a + *b + *c + *d > target) {
--d;
} else {
result.push_back({ *a, *b, *c, *d });
++c;
--d;
}
}
}
}
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end());
return result;
}

leetcode 之Sum系列(七)的更多相关文章

  1. [Leetcode] Combination Sum 系列

    Combination Sum 系列题解 题目来源:https://leetcode.com/problems/combination-sum/description/ Description Giv ...

  2. [LeetCode]Path Sum系列

    1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可 public boolean hasPathS ...

  3. [Leetcode] Sum 系列

    Sum 系列题解 Two Sum题解 题目来源:https://leetcode.com/problems/two-sum/description/ Description Given an arra ...

  4. C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和

    上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...

  5. LeetCode:Path Sum I II

    LeetCode:Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...

  6. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  7. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  8. C语言高速入口系列(七)

    C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...

  9. 7.oracle学习门户系列七---网络管理和配置

    oracle学习门户系列七 网络管理和配置 们学习了模式和用户.包含模式定义以及模式的作用. 这篇我么来看下ORACLE数据库中的网络管理和配置.只是这篇好像和上篇没有继承啊.这怎么看? Ok,事实上 ...

随机推荐

  1. 【比赛】HNOI2018 道路

    这题很考思维啊,考验我们能否快速从省选难度跳转到普及难度 考试的时候真的想得太多,觉得省选不可能这么简单吧,然后就打脸 设 \(f[i][j][x]\) 表示从根到 \(x\) 号点,有 \(i\) ...

  2. 模块(3)-使用__future__

    使用__future__ Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了. 从Pyt ...

  3. 解题:APIO 2014 回文串

    题面 初见SAM 洛谷数据太弱了,我SAM写错了居然有90pts=.=??? SAM求一个子串$(l,r)$的出现次数:从右端点对应状态开始在parent树上倍增,当目标节点的$len$大于等于子串长 ...

  4. 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用

    题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...

  5. jsp 的 3 个编译指令

    JSP 的编译指令是通知 JSP 引擎的消息,它不直接生成输出. 常见的编译指令有如下三个: 1.page:该指令是针对当前页面的指令 2.include:用于指定包含另一个页面 3.taglib:用 ...

  6. centos7 配置 yum 安装的 jdk

    yum 安装的 java,jdk 路径默认是 /usr/lib/jvm/java-* 我们修改 .bash_profile 文件加上下面几行: export JAVA_HOME=/usr/lib/jv ...

  7. 抓包 ------ Wireshark 的使用

    Wireshark的数据包详情窗口,如果是用中括号[]括起来的,表示注释,在数据包中不占字节 发了一个包,很久没有收到应答后,会重发包,在Wireshark抓包工具提示“[TCP Retransmis ...

  8. Qt ------ QElapsedTimer 计算消耗多少时间

    The QElapsedTimer class provides a fast way to calculate elapsed times. The QElapsedTimer class is u ...

  9. 题解 P2598 【[ZJOI2009]狼和羊的故事】

    P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...

  10. CentOS下安装JDK1.8

    0.卸载旧版本 键入命令java-version,查询当前JDK版本 如果版本号不是想要的,键入rpm -qa|grep gcj 键入命令 yum -y remove (后接查询得到的版本),移除老版 ...