leetcode 之Sum系列(七)
第一题是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系列(七)的更多相关文章
- [Leetcode] Combination Sum 系列
Combination Sum 系列题解 题目来源:https://leetcode.com/problems/combination-sum/description/ Description Giv ...
- [LeetCode]Path Sum系列
1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可 public boolean hasPathS ...
- [Leetcode] Sum 系列
Sum 系列题解 Two Sum题解 题目来源:https://leetcode.com/problems/two-sum/description/ Description Given an arra ...
- C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和
上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...
- 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 ...
- WCF编程系列(七)信道及信道工厂
WCF编程系列(七)信道及信道工厂 信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...
- SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现
原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...
- C语言高速入口系列(七)
C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...
- 7.oracle学习门户系列七---网络管理和配置
oracle学习门户系列七 网络管理和配置 们学习了模式和用户.包含模式定义以及模式的作用. 这篇我么来看下ORACLE数据库中的网络管理和配置.只是这篇好像和上篇没有继承啊.这怎么看? Ok,事实上 ...
随机推荐
- Docker学习笔记一:如何在线安装
一.Docker简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- HDU 4383 To The Moon 解题报告
HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...
- C之面向对象编程20170707
语言只是工具,设计思维才是根本.C虽然是面向过程的语言,但也是可以实现面向对象编程的,本文就是介绍如何使用C语言实现面向对象编程. 我们知道面向对象主要有三大特性:封装,继承,和多态,下面就从这个三个 ...
- libevent学习文档(三)working with event
Events have similar lifecycles. Once you call a Libevent function to set up an event and associate i ...
- selectors
一.Selectors模块 它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll,建议使用selectors. 常用共分为三种:sel ...
- jquery ajax thinkphp异步局部刷新完整流程
环境:ThinkPHP3.2.3,jQuery3.2 前言: 在一般的网站中,都需要用到jquery或者其他框架(比如angular)来处理前后端数据交互,thinkphp在后台也内置了一些函数用 ...
- Windows 2008 R2上配置IIS7或IIS7.5中的URLRewrite(URL重写)实例
1. 安装URL Rewrite模块 下载页面 re_write_x86_zh_CN.msi from microsoft re_write_x64_zh_CN.msi from microsoft安 ...
- OpenCV---图像直方图
一:直方图的直接使用 from matplotlib import pyplot as plt def plot_demo(image): print(image.ravel()) plt.hist( ...
- Linux下打包压缩war和解压war包 zip和jar
============jar================= 把当前目录下的所有文件打包成game.warjar -cvfM0 game.war ./ -c 创建war包-v 显示过程信息 ...
- 【算法日记】Dijkstra最短路径算法
上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算 ...