LintCode-三数之和 II

题目描述:

  给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和。

 注意事项

  只需要返回三元组之和,无需返回三元组本身

样例

  例如S = [-1, 2, 1, -4] and target = 1.  和最接近1的三元组是 -1 + 2 + 1 = 2.

 

 

 1 public class Solution {
 2     /**
 3      * @param numbers: Give an array numbers of n integer
 4      * @param target : An integer
 5      * @return : return the sum of the three integers, the sum closest target.
 6      */
 7     public int threeSumClosest(int[] numbers ,int target) {
 8      // 记录最小的差值
 9         long minDiff = Long.MAX_VALUE;
10         // 记录最小差值对应的三个整数和
11         long result = 0;
12         // 每次求得的差值
13         long diff;
14         // 每次求得的三个整数的和
15         long sum;
16 
17         // 先对数组进行排序
18         Arrays.sort(numbers);
19 
20 
21         // i表示假设取第i个数作为结果
22         for (int i = 0; i < numbers.length - 2; i++) {
23             // 第二个数可能的起始位置
24             int j = i + 1;
25             // 第三个数可能是结束位置
26             int k = numbers.length - 1;
27 
28             while (j < k) {
29                 // 求当前三个数的和
30                 sum = numbers[j] + numbers[k] + numbers[i];
31                 // 当前和与目标和之间的差值
32                 diff = Math.abs(target - sum);
33 
34                 // 差值为0就直接返回
35                 if (diff == 0) {
36                     return (int) sum;
37                 }
38 
39                 // 如果当前的差值比之前记录的差值小
40                 if (diff < minDiff) {
41                     // 更新最小的差值
42                     minDiff = diff;
43                     // 更新最小差值对应的和
44                     result = sum;
45 
46                     // 以上的设置在下一次元素处理时生效
47                 }
48 
49 
50                 // 和大于target
51                 if (sum > target) {
52                     k--;
53                 }
54                 // 和小于target
55                 else {
56                     j++;
57                 }
58             }
59         }
60 
61         return (int) result;
62     }
63 }

 

 

 

posted @ 2016-04-07 17:58  JosephDcc  阅读(228)  评论(0编辑  收藏  举报