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 的信号 ...
 
随机推荐
- 关于AFNetWorking 2.5.4之后版本编译报错问题解决方案
			
最近升级了AFN框架到2.6版本然后编译却出错了 错误如下: 错误出现在 AFSecurityPolicy.h 这个类中 解决办法如下: 在项目的.pch文件里添加 #ifndef TARGET_OS ...
 - `<img>`放到`<div>`中底部出现空隙 以及解放方案.
			
形成情况: 外部的 不设置宽高, 由内部图片撑开 撑开后, 底部会有空隙 问题原因: div元素中的行内元素的默认vertical-align对齐方式是基线baseline img是行内元素, 所以会 ...
 - Unity Mesh 初体验
			
什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...
 - vs直接IP访问运行项目
			
找到IIS Express 正在运行的项目应用程序,点击网站,会出现配置路径,找到配置路径,显示隐藏的文件夹 localhost替换成本地IP,重新运行项目,然后就可以直接通过IP访问项目,好处就是便 ...
 - JSP报错The value for the useBean class attribute *** is invalid.
			
环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...
 - Android小玩意儿-- 从头开发一个正经的MusicPlayer(二)
			
1·在Service中实例化MusicPlayer,实现对整个播放过程的控制 上一次做到了找到音乐数据,并封装成对象装在ArrayList里,把数据的信息显示在UI上.下面一个阶段就要开始真正的音乐播 ...
 - Implicit Animations  默认动画 读书笔记
			
Implicit Animations 默认动画 读书笔记 Do what I mean, not what I say. Edna Krabappel, The Simpsons Part I ...
 - redis源码分析之事务Transaction(下)
			
接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需 ...
 - 50个Bootstrap扩展插件
			
Bootstap这个框架本身已经包含了开发网页的众多要素,包括了常用的工具以及扩展组件,如果你在开发页面时觉得在某些方面还不够的话,不妨看看最新收集的50个Bootstrap扩展插件,这些插件在我们平 ...
 - (转)Spring管理的Bean的生命周期
			
http://blog.csdn.net/yerenyuan_pku/article/details/52834011 bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们 ...