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 }

浙公网安备 33010602011771号