题目:给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
解题思路:题目要求找到与目标值 target 最接近的三元组,这里的「最接近」即为差值的绝对值最小。我们可以考虑直接使用三重循环枚举三元组,找出与目标值最接近的作为答案,时间复杂度为 O(N^3)。本题的N最大为1000,会超过时间限制。
class Solution{ public int threeSumClosest(int []nums,int target){ Arrays.sort(nums); int n=nums.length; int best=10000000; //枚举a for(int i=0;i<n;++i){ //保证和上一次枚举的元素不相等 if(i>0 && nums[i]==nums[i-1]){ continue; } //使用双指针枚举b和c int j=i+1,k=n-1; while(j<k){ int sum=nums[i]+nums[j]+nums[k]; //如果和为target直接返回答案 if(sum==target){ return target; } //根据差值的绝对值来更新答案 if(Math.abs(sum-target)<Math.abs(best-target)){ best=sum; } if(sum>target){ // 如果和大于 target,移动 c 对应的指针 int k0 = k - 1; // 移动到下一个不相等的元素 while (j < k0 && nums[k0] == nums[k]) { --k0; } k=k0; }else { // 如果和小于 target,移动 b 对应的指针 int j0 = j + 1; // 移动到下一个不相等的元素 while (j0 < k && nums[j0] == nums[j]) { ++j0; } j = j0; } } } return best; } }