# 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]...

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

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

• ### （转）iOS学习——UIlabel设置行间距和字间距

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

• ### [优秀题解]题目1277[Lucky Word]

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

• ### LeetCode - 删除最外层的括号

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

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

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