No.016 3Sum Closest

16. 3Sum Closest

  • Total Accepted: 86565
  • Total Submissions: 291260
  • Difficulty: Medium

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

 思路:

  本题的解法和上一次3Sum的解法有点类似,我们可以先将数组排序,然后将数组中的数从左到右依次确定为第一个数,在其右边的数中寻找最接近的target的数即可。重要的是判断逻辑的思路。代码如下:

 1 public int threeSumClosest(int[] nums, int target) {
 2     if (nums == null || nums.length < 3) {
 3         return 0;
 4     }
 5         
 6     Arrays.sort(nums);
 7     
 8     int closest = nums[0]+nums[1]+nums[2] ;
 9     
10     for(int i = 0 ; i < nums.length-2 ; i++){
11         int l = i+1 ;
12         int r = nums.length-1 ;            
13         while(l < r){
14             int sum = nums[i] + nums[l] + nums[r] ;
15             if(sum == target){
16                 return sum ;
17             }else if(sum < target){
18                 /*
19                  * 三种情况:
20                  *     1、closest < sum < target --->closest = sum
21                  *     2、sum < target < closest --->| target-sum < closest-target ---> closest = sum
22                  *                                   | target-sum >= closest-target --> closest不变
23                  *     3、sum <= closest <= target ---> closest不变
24                  */
25                 if(sum > closest){
26                     //情况1
27                     closest = sum ;
28                 }else if(closest > target){
29                     //情况2
30                     if(target-sum < closest-target){
31                         //情况2.1,
32                         closest = sum ;
33                     }
34                     //情况2.2不用变化
35                 }
36                 //情况3不同变化
37                 l++ ;
38             }else{
39                 //分析同上
40                 if(sum < closest){
41                     closest = sum ;
42                 }else if(closest < target){
43                     if(sum-target <= target-closest){
44                         closest = sum ;
45                     }
46                 }
47                 r-- ;
48             }
49         }
50         
51     }        
52     return closest ;
53 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何求最小三元组距离

    题目描述:   已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,使得组成的三元组距离最小。   三元组的距离定义是:假设a[i]...

    mukekeheart
  • iOS学习——UITableViewCell两种重用方法的区别

      今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清...

    mukekeheart
  • (转)iOS学习——UIlabel设置行间距和字间距

      在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行...

    mukekeheart
  • poj-3094-quicksum

    瑾诺学长
  • [优秀题解]题目1277[Lucky Word]

    题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这...

    编程范 源代码公司
  • 2014移动互联网数据报告(91PPT)

    大数据文摘
  • LeetCode - 删除最外层的括号

    原题地址:https://leetcode-cn.com/problems/remove-outermost-parentheses/

    晓痴
  • Windows 7 设置devenv.exe启动版本

        我机子上装了有vs 05、vs 08、vs 10如果按上顺序安装的话,在 运行 => devenv 就可以打开最新的vs10 工具,如果顺序是乱的话,就...

    Java中文社群_老王
  • Python发邮件

    week
  • ViewModels 简单入门

    Android 开发者

扫码关注云+社区

领取腾讯云代金券