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).
附上自己的解题

首先我们要有个大概的思路 第一步无疑是判断是否为空和满足三个数的条件

接下来我们对数据进行排序

从数组最小的数字开始进行for循环 将它与它右边第一个数left和数组的最后一个数right相加 获得一个总值 这个总值如果比目标值小将left加一 反之将right减一 如果正好等于 目标值 那么将结果直接返回 循环要维护一个closet值 这个值代表已知的SUM里面最接近target的sum值 循环结束 返回closet;

之所以把初始值设置为integer.max_value/2 是为了 closet-target这个操作不溢出

这段代码耗时22ms 附上细节

显然这段代码不是最优的 进去discuss看看别人的解法

有一段java 3/4ms的解法 果断进去看

public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int n = nums.length, p = -1; // for getting closest sum3[p] to target
int[] sum3 = new int[n-2];
for (int i=0; i<n-2; i++) {
sum3[i] = nums[i]+nums[i+1]+nums[i+2];
if (sum3[i]==target) return target;
if (sum3[i]<target) p = i;
}
if (p==-1) return sum3[0];
if (p==n-3) return sum3[n-3]; int l, m, r;
if (target-sum3[p] <= sum3[p+1]-target) m = p+1; // (sum3[p]=nums[l]+nums[m]+nums[r])
else m = p+2; // sum3[p+1] is the closest sum
l = m-1;
r = m+1;
int gap = sum3[m-1]-target; // gap records the smallest gap to target for now while (l>=0 && r<=n-1) {
int w = target-nums[l]-nums[r];
int a = l+1, b = r-1;
int tmp = Integer.MAX_VALUE; // tmp records smallest gap for m in (l,r)
while (a<=b) {
int t = nums[m] - w;
if (t==0) return target;
if (t>0) b = m-1;
else a = m+1;
if (Math.abs(t)<Math.abs(tmp)) tmp = t;
m = (a+b)/2;
}
if (tmp>0) l--; // for nums[l]+nums[m]+nums[r], if smallest gap is positive, we need to make the sum less
else r++;
if (Math.abs(tmp)<Math.abs(gap)) gap = tmp;

之所以这段代码运行时间短 是因为它先做了预处理 不像我们的代码直接循环 并且先找到一个接近下标再进行循环 它先遍历一遍相邻的三个数之和 得到一个p值 如果P值没发生变化 那么整个说明没有找到和比target小的 无疑前三个的和就是答案 直接返回 相反如果P是最后三个数的和的第一个下标  那么说明 最后三个数的和都比target小 最后三个数的和无疑是最接近的 直接返回 便利过程中如果找到了和为target的直接返回结果

												

2016/10/28 很久没更了 leetcode解题 3sumcloset的更多相关文章

  1. 2016/10/28 很久没更了 leetcode解题 3sum

    15. 3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fi ...

  2. 2016/10/28 很久没更了 leetcode解题 3sum问题进阶版4sum

    18. 4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c  ...

  3. 2016 10 28考试 dp 乱搞 树状数组

    2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...

  4. MIT JOS学习笔记02:kernel 01(2016.10.28)

    未经许可谢绝以任何形式对本文内容进行转载! 在文章开头不得不说的是,因为这部分的代码需要仔细理清的东西太多,所以导致这篇分析显得很啰嗦,还请谅解. 我们在上一篇文章已经分析了Boot Loader的功 ...

  5. 很久没来这里,今天的评测java怪东西,左右Date类和时间戳转换

    在发展过程中,经常会遇到利用上课时间.说话的Date类就不得不提时间戳,左右fr=aladdin" target="_blank">的定义大家能够看看网上对时间戳的 ...

  6. 百度翻译api初使用(很久没写python了,写几行玩玩)

    调用free api做做简易的翻译 这个是百度翻译api文档 http://api.fanyi.baidu.com/api/trans/product/apidoc 照着百度api给的文档向web服务 ...

  7. 久未更 ~ 一之 —— 关于ToolBar

    很久没更博客了,索性开一个久未更 系列 > > > > > 久未更 系列一:关于ToolBar的使用(后续补充) //让 ToolBar 单独使用深色主题 使得 tool ...

  8. My latest news (--2016.10)

    2016.10.31 22:44 一个“程序”,打代码占40%.思考占60% 2016.10.30 20:53 周末,话说今天有晚上讲座,还点名,了,悲催.之前学习的Qt有点问题,悲催.推荐个博文:h ...

  9. 2016.10.5初中部上午NOIP普及组比赛总结

    2016.10.5初中部上午NOIP普及组比赛总结 这次的题目出得挺有质量的.但我觉得我更应该努力了. 进度: 比赛:0+20+0+0=20 改题:AC+AC+AC+AC=AK kk的作业 这题我错得 ...

随机推荐

  1. Windows自带的驱动程序例子都在哪里?

    MSDN官方说明:https://msdn.microsoft.com/windows/hardware/drivers/samples/index 各个操作系统驱动例子: Windows10  :h ...

  2. Java中的枚举

    枚举通过enum关键字进行定义.实际上当定义一个枚举类型的时候,该类型默认继承了Enum类. 枚举的定义格式如下: enum Color { RED,BLUE,GREEN; } 下面演示一个枚举变量的 ...

  3. Android 获取设备信息 异常

    /**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ ...

  4. weblogic 优化设置 http://wenku.baidu.com/view/c42e7a5bbe23482fb4da4cf2.html

    引自:http://wenku.baidu.com/view/c42e7a5bbe23482fb4da4cf2.html

  5. WinCE系统深度定制汇总

    WinCE应用程序崩溃提示框的处理 WinCE6.0多国语言软键盘 定制WinCE6.0标准界面的一种方法 如何禁用WinCE下的沙漏图标 Silent RNAApp.exe for WinCE6.0 ...

  6. operator 的两种用法

    C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...

  7. js实现判断浏览器版本

    //判断浏览器版本是否过低 var ua = navigator.userAgent.toLowerCase(); if (window.ActiveXObject) var IEversion = ...

  8. vi的查找与替换

    0x01 查找 (在命令行模式下) /<要查找的字符>   向下查找要查找的字符 ?<要查找的字符>   向上查找要查找的字符 0x02 替换 (在底行模式下) :0,$s/s ...

  9. IE 下JS和CSS 阻塞后面内容总结

    总结: 1.  CSS 都是可以并行下载的. 2.  IE6 和 IE7   JS 不能并行下载,CSS 和 JS 阻塞后面内容下载. 3.  IE8   JS 还是会阻塞图片下载 开始改变加载模式, ...

  10. LCD如何显示图像

    1.LCD显示主要相关概念 (1)像素(pixel) 整个图像是由一个个的像素组成的,像素就是一个显示点.像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的 ...