leetcode.数组.16最接近的三数之和-java

1. 具体题目

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.  与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

2. 思路分析

如果将每种可能列举出来与 target 进行比较,时间复杂度为O(n^3),考虑将数组排列后进行计算。对于有序数组,算法可以参考leetcode167两数之和,也就是设置前后指针从数组两端逼近结果值。但是在本题中,需要再设置一个指针当作第三个数。

在数组 nums 中进行遍历,每次形成一个固定值 nums[i],并且令前指针指向 i + 1 处,后指针指向 nums.length - 1 处,前后指针再进行逼近,每次判断 三数之和 sum 与目标 target 的距离,如果更近则更新结果。

3. 代码

 1 public int threeSumClosest(int[] nums, int target) {
 2         Arrays.sort(nums);
 3         int res = nums[0] + nums[1] + nums[2];
 4         for(int i = 0; i < nums.length; i++){
 5             int start = i + 1, end = nums.length - 1;
 6             while(start < end){
 7                 int sum = nums[i] + nums[start] + nums[end];
 8                 int diff = target - sum;
 9                 if(diff > 0){
10                     if(diff < Math.abs(res - target)){
11                         res = sum;
12                     }
13                     start++;
14                 }else if(diff < 0){
15                     if(-diff < Math.abs(res - target)){
16                         res = sum;
17                     }
18                     end--;
19                 }else{
20                     return sum;
21                 }
22             } 
23         }
24         return res;
25     }

 

posted @ 2019-11-18 10:13  les111ley  阅读(218)  评论(0)    收藏  举报