博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 16. 3Sum Closest
阅读量:6579 次
发布时间:2019-06-24

本文共 1753 字,大约阅读时间需要 5 分钟。

16. 3Sum Closest 

 ----------------------------------------------------------------------------

Mean: 

给定一个整数序列和一个目标数,在序列中找出三个数,使得这三个数的和与目标数的差最小.

analyse:

O(n^2)的做法.

如果你找到了更好的做法,请赐教^_^

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-02-17-08.50
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
class
Solution
{
public
:
   
int
threeSumClosest(
vector
<
int
>&
nums
,
int
target)
   
{
       
int
si
=
nums
.
size();
       
if(
si
<
3)
return
0;
       
if(
si
==
3)
return (
nums
[
0
]
+
nums
[
1
]
+
nums
[
2
]);
       
int64_t
res
=
INT_MAX
,
low
,
high
,
sum
,
tsum;
       
sort(
nums
.
begin
(),
nums
.
end());
       
for(
int
i
=
0;
i
<
si;
++
i)
       
{
           
low
=
i
+
1;
           
high
=
si
-
1;
           
tsum
=
target
-
nums
[
i
];
           
while(
low
<
high)
           
{
               
sum
=(
nums
[
i
]
+
nums
[
low
]
+
nums
[
high
]);
               
if(
abs(
target
-
res)
>
abs(
target
-
sum))
                   
res
=
sum;
                   
               
if(
nums
[
low
]
+
nums
[
high
]
<
tsum)
                   
++
low;
               
else
if(
nums
[
low
]
+
nums
[
high
]
>
tsum)
                   
--
high;
               
else
                   
return
target;
           
}
       
}
       
return (
int)
res;
   
}
};
int
main()
{
   
Solution
solution;
   
int n
,
target;
   
while(
cin
>>n
>>
target)
   
{
       
vector
<
int
>
ve;
       
for(
int
i
=
0;
i
<n;
++
i)
       
{
           
int
tmp;
           
cin
>>
tmp;
           
ve
.
push_back(
tmp);
       
}
       
int
ans
=
solution
.
threeSumClosest(
ve
,
target);
       
cout
<<
ans
<<
endl;
   
}
   
return
0;
}

转载于:https://www.cnblogs.com/crazyacking/p/5194421.html

你可能感兴趣的文章
MTK APSoC SDK MT7621编译固件的快速开始
查看>>
【Hibernate】Hibernate.cfg.xml配置文件详解
查看>>
关于KMP算法的学习
查看>>
delete select 表
查看>>
2. composer的简单操作
查看>>
maven setting
查看>>
二叉树中和为某一值的路径
查看>>
Android 应用语言设置的实现
查看>>
深度解析Istio系列之安全模块篇
查看>>
Linux 系统 审计
查看>>
uPortal 5.2.1特性及定制清单
查看>>
基于TP5的微信的公众号获取登录用户信息
查看>>
大数据系列8:Sqoop – HADOOP和RDBMS数据交换
查看>>
Jenkins 安装笔记
查看>>
SonarQube + Scanner的安装配置及使用
查看>>
百度地图
查看>>
PHP 变色验证码实例
查看>>
XPC
查看>>
《Concise课程表》开发过程总结
查看>>
Mysql Explain 详解
查看>>