LeetCode(16)3Sum Closest
题目
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
分析
这题目与上一题十分相似。求出整数数组序列中与目标值最接近的三元组元素之和。
解这个题目条件反射的方法是三层遍历,求和比较,但是显而易见,在LeetCode提交时必然会出现超时的异常。所以必须另觅他法,这个题目的AC代码源于参考,在此表示感谢。
Time Limit Exceeded代码
class Solution {
public:
//方法一:三层穷举,超时异常
int threeSumClosest(vector<int>& nums, int target) {
int len = nums.size();
if (len < 3)
{
return 0;
}
int closest = nums[0] + nums[1] + nums[2];
for (int i = 1; i < len-2; i++)
{
//首先进行去重操作
if (nums[i] == nums[i - 1])
continue;
for (int j = i + 1; j < len - 1; j++)
{
if (nums[j] == nums[j - 1])
continue;
for (int k = j + 1; k < len; k++)
{
if (nums[k] == nums[k - 1])
continue;
int sum = nums[i] + nums[j] + nums[k];
if (sum == target)
{
closest = sum;
break;
}//if
else if (abs(sum - target) < abs(closest - target))
{
closest = sum;
}//elif
else
continue;
}//for
}//for
}//for
return closest;
}
int abs(int a)
{
return a > 0 ? a : 0-a;
}
};
AC代码
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
size_t size = nums.size();
if (size < 3)
{
cout << "num size must bigger than there!" << endl;
return 0;
}
sort(nums.begin(), nums.end()); // 对于以下的处理过程必须事先排序,类似二分搜索
int result = 0; // 记录最终结果
int distance = numeric_limits<int>::max(); // signed int
int sum = 0; // 中间结果
size_t i = 0, j = i + 1, k = size - 1;
for (i = 0; i < size - 2; i++) // 三元组的第一个元素一次遍历,范围为[0...n-3]
{
// 去重避免重复计算,如果和上次同则跳过
if (i > 0 && nums[i] == nums[i - 1])
{
continue;
}
j = i + 1; // 选定三元组第一个元素后,第二个元素从第一个元素的下一个位置开始考察
k = size - 1; // 选定三元组第一个元素后,第三个元素从数组末尾开始考察
while (j < k) // 三元组的后两个元素利用左右逼近来跳过效率,选定第一个元素后,其后的所有元素只需考察一遍
{
sum = nums[i] + nums[j] + nums[k];
if (sum == target) // 存在距离最近为0则直接返回,否则穷举选取非0最小距离
{
return sum;
}
else if (sum < target)
{
if ((target - sum) < distance)
{
result = sum;
distance = target - sum;
}
j = j + 1;
// 避免重复计算,如果和上次同则跳过
if (nums[j] == nums[j - 1])
{
j = j + 1;
}
}
else if (sum > target)
{
if ((sum - target) < distance)
{
result = sum;
distance = sum - target;
}
k = k - 1;
// 避免重复计算如果和上次同则跳过
if (nums[k] == nums[k + 1])
{
k = k - 1;
}
}
}
}
return result;
}
};
LeetCode(16)3Sum Closest的更多相关文章
- leetcode第16题--3Sum Closest
Problem:Given an array S of n integers, find three integers in S such that the sum is closest to a g ...
- LeetCode(16):最接近的三数之和
Medium! 题目描述: 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只 ...
- LeetCode(15) 3Sum
题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
- LeetCode(15)3Sum
题目如下: Python代码: def threeSum(self, nums): res = [] nums.sort() for i in xrange(len(nums)-2): if i &g ...
- Web 在线文件管理器学习笔记与总结(15)剪切文件夹 (16)删除文件夹
(15)剪切文件夹 ① 通过rename($oldname,$newname) 函数实现剪切文件夹的操作 ② 需要检测目标文件夹是否存在,如果存在还要检测目标目录中是否存在同名文件夹,如果不存在则剪切 ...
- Windows Phone开发(16):样式和控件模板
原文:Windows Phone开发(16):样式和控件模板 在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- leecode刷题(16)-- 字符串转换整数
leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...
- Qt 学习之路 2(16):深入 Qt5 信号槽新语法
Qt 学习之路 2(16):深入 Qt5 信号槽新语法 豆子 2012年9月19日 Qt 学习之路 2 53条评论 在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号 ...
随机推荐
- EditPlus 3:设置自动换行
打开软件,菜单栏点击Document,再在下拉栏中点击Permanent Settings,然后在弹出的设置框中找到Word Wrap点击,最后在弹出的小框中勾选第一个Enable word wrap ...
- UltraEdit的免费激活方法
本来前段时间用UE编辑器用的好好的,然后今天突然提示我使用到期,需要购买激活.一脸懵逼中,只好再次激活,谁知道按照原来的方法激活的时候一直提示您输入的许可证id或密码错误 请您检查注册邮件并且重试. ...
- Jury Meeting CodeForces - 854D
Jury Meeting CodeForces - 854D 思路:暴力枚举会议开始的那一天(只需用所有向0点飞的航班的那一天+1去枚举即可),并计算所有人此情况下去0点和从0点出来的最小花费. 具体 ...
- 增强的for循环
- PowerShell~语法与运算符
基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...
- MySQL优化步骤和my.cnf优化配置
1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...
- 动手实现 Redux(四):共享结构的对象提高性能
接下来两节某些地方可能会稍微有一点点抽象,但是我会尽可能用简单的方式进行讲解.如果你觉得理解起来有点困难,可以把这几节多读多理解几遍,其实我们一路走来都是符合“逻辑”的,都是发现问题.思考问题.优化代 ...
- Elasticsearch (2) - 映射
常用映射类型 核心的字段类型如下: String 字符串包括text和keyword两种类型: 1.text analyzer 通过analyzer属性指定分词器. 下边指定name的字段类型为tex ...
- linux php扩展安装gettext
php解压后的文件路径为/usr/local/src/php-5.2.6 php 的安装路径为/usr/local/php [root@localhost# cd /usr/local/src/ph ...
- mysql出错排查
1,例如:Can't connect to local MySQL server through socket '/tmp/mysql-5.5.37.sock' (2) Mysql链接出错,请配置/A ...