题目

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;
}
};

GitHub测试程序源码

LeetCode(16)3Sum Closest的更多相关文章

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

  2. LeetCode(16):最接近的三数之和

    Medium! 题目描述: 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只 ...

  3. 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 ...

  4. LeetCode(15)3Sum

    题目如下: Python代码: def threeSum(self, nums): res = [] nums.sort() for i in xrange(len(nums)-2): if i &g ...

  5. Web 在线文件管理器学习笔记与总结(15)剪切文件夹 (16)删除文件夹

    (15)剪切文件夹 ① 通过rename($oldname,$newname) 函数实现剪切文件夹的操作 ② 需要检测目标文件夹是否存在,如果存在还要检测目标目录中是否存在同名文件夹,如果不存在则剪切 ...

  6. Windows Phone开发(16):样式和控件模板

    原文:Windows Phone开发(16):样式和控件模板 在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的 ...

  7. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  8. leecode刷题(16)-- 字符串转换整数

    leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...

  9. Qt 学习之路 2(16):深入 Qt5 信号槽新语法

    Qt 学习之路 2(16):深入 Qt5 信号槽新语法  豆子  2012年9月19日  Qt 学习之路 2  53条评论 在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号 ...

随机推荐

  1. Jenkins自动化部署——持续交付

    感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多的实践, ...

  2. Zernike矩之图像重建(附源码)

    源码下载 参考: [1] Teague M R. Image analysis via the general theory of moments[J]. JOSA, 1980, 70(8): 920 ...

  3. vmware虚拟机启动centOs黑屏

    如图所示  , 我的VM 启动虚拟机之后就变成了上面的样子,一直不动,ping也ping不好,这个时候 : 1. 要么 内存不够了: 2. 要么 网络协议存在问题了: 本地windows环境在管理员的 ...

  4. 转--oracle查看允许的最大连接数和当前连接数等信息

    两个参数间的关系:sessions=1.1*processes+5 目前总结的语句,在查看数据的连接情况很有用,写完程序一边测试代码一边查看数据库连接的释放情况有助于分析优化出一个健壮的系统程序来. ...

  5. Linux下cpu过高问题排查

    原文地址:https://blog.csdn.net/chenjunan888/article/details/80447800 在服务器报cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具 ...

  6. CentOS6.5下安装Redis2.8.6和phpredis2.2.4扩展

    一.版本说明 CentOS版本 [plain]view plaincopyprint? [root@localhost ~]# uname Linux [root@localhost ~]# unam ...

  7. P2955 [USACO09OCT]奇数偶数Even? Odd?

    题目描述 Bessie's cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive int ...

  8. WPF日常需要使用的操作

    窗体如何居中弹出 在窗体上添加属性  WindowStartupLocation="CenterScreen" 窗体如何隐藏掉windows边框 添加属性WindowStyle=& ...

  9. CF985E Pencils and Boxes

    思路: 先对a数组排序,然后使用动态规划.dp[i]表示前i个能否正确划分.则如果存在dp[j] == 1, i - j + 1 >= k并且a[i] - a[j] < d,那么dp[i] ...

  10. RxJava尝试取代Handler初探

    在之前的一篇文章中,我们探究了RxJava的使用方法,详细请看https://www.cnblogs.com/yanyojun/p/9745675.html 根据扔物线大神的描述,如果用一个词来概括R ...