题目:
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:
基本上和之前15题的三数之和的思路一样,但是不用判断元素是否相同。我自己写的代码由一点问题,以下是leetcode中相类似的代码。
代码:
class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums!=null&&nums.length>2)
Arrays.sort(nums); //注意排序的写法
//int ans=Integer.MAX_VALUE; //这里不知道为什么出错
int ans=100000;
for(int i=0;i<nums.length;i++)
{
int j=i+1;
int k=nums.length-1;
while(j<k)
{
int temp=nums[i]+nums[j]+nums[k];
ans=Math.abs(target-temp)<Math.abs(target-ans)?temp:ans;
if(temp<target)
j++;
else if(temp>target)
k--;
else
return temp;
}
}
return ans;
}
}
补充:
sort()是一个静态的排序方法。默认是从小到大的排序。
类似代码:
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int delta = Integer.MAX_VALUE;
int closestSum=0;
for (int i=0; i<nums.length-2; i++){
int j=i+1, k=nums.length-1;
while (j<k){
int sum = nums[i] + nums[j] + nums[k];
if (sum == target){
return sum;
}
else if (sum < target){
j++;
}
else {
k--;
}
if (Math.abs(sum-target) < delta){
delta = Math.abs(sum-target);
closestSum = sum;
}
}
}
return closestSum;
}
}