给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
这题参考了15题三数之和的解法,依次遍历固定第一个数,用两个指针去寻找另外两个数,不过这题比上一题要简单点。算法在暴力的基础上有所改进,因为寻找过程中停止条件设置为两个指针相遇,实际上还可以进一步优化。
python:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
n = len(nums)
if n < 3:
return 0
if n == 3:
return sum(nums)
minSum = sum(nums[-3:])
delta = abs(minSum - target)
for k in range(n-2):
i = k+1
j = n-1
while i<j:
if nums[k]+nums[i]+nums[j] == target:
return target
elif nums[k]+nums[i]+nums[j] > target:
if(abs(nums[k]+nums[i]+nums[j]-target) < delta):
minSum = nums[k]+nums[i]+nums[j]
delta = abs(nums[k]+nums[i]+nums[j]-target)
j -= 1
elif nums[k]+nums[i]+nums[j] < target:
if(abs(nums[k]+nums[i]+nums[j]-target) < delta):
minSum = nums[k]+nums[i]+nums[j]
delta = abs(nums[k]+nums[i]+nums[j]-target)
i += 1
return minSum
C++:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int n = nums.size();
if(n < 3) return 0;
if(n == 3) return (nums[0]+nums[1]+nums[2]);
int minSum = nums[0]+nums[1]+nums[2];
int delta = (nums[0]+nums[1]+nums[2]-target)>0?(nums[0]+nums[1]+nums[2]-target):(target-nums[0]-nums[1]-nums[2]);
for(int k = 0;k < n-2;k++){
int i = k + 1;
int j = n - 1;
while(i < j){
if(nums[k]+nums[i]+nums[j]-target == 0) return target;
else if(nums[k]+nums[i]+nums[j] < target){
int temp = (nums[k]+nums[i]+nums[j]-target)>0?(nums[k]+nums[i]+nums[j]-target):(target-nums[k]-nums[i]-nums[j]);
if(temp<delta){
delta = temp;
minSum = nums[k]+nums[i]+nums[j];
}
i += 1;
}
else if(nums[k]+nums[i]+nums[j] > target){
int temp = (nums[k]+nums[i]+nums[j]-target)>0?(nums[k]+nums[i]+nums[j]-target):(target-nums[k]-nums[i]-nums[j]);
if(temp<delta){
delta = temp;
minSum = nums[k]+nums[i]+nums[j];
}
j -= 1;
}
}
}
return minSum;
}
};