题目:
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
解法:
解法和3Sum相似,不过要记录与目标值的差值,每次差值变小时更新结果
c++:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int res = 0;
int min_gap = INT_MAX;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size() - 2; i++){
if(i > 0 && nums[i] == nums[i - 1]) continue;
int lo = i + 1;
int hi = nums.size() - 1;
while(lo < hi){
int sum = (nums[i] + nums[lo] + nums[hi]);
if(sum == target) return sum;
if(abs(sum - target) < min_gap){
res = sum;
min_gap = abs(sum - target);
}
if(sum < target){
while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
lo++;
} else {
while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
hi--;
}
}
}
return res;
}
};
java:
class Solution {
public int threeSumClosest(int[] nums, int target) {
int res = 0;
int min_gap = Integer.MAX_VALUE;
Arrays.sort(nums);
for(int i = 0; i < nums.length - 2; i++){
if(i > 0 && nums[i] == nums[i - 1]) continue;
int lo = i + 1;
int hi = nums.length - 1;
while(lo < hi){
int sum = (nums[i] + nums[lo] + nums[hi]);
if(sum == target) return sum;
if(Math.abs(sum - target) < min_gap){
res = sum;
min_gap = Math.abs(sum - target);
}
if(sum < target){
while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
lo++;
} else {
while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
hi--;
}
}
}
return res;
}
}
python:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
res = 0
min_gap = sys.maxsize
nums.sort()
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]: continue
lo = i + 1
hi = len(nums) - 1
while lo < hi:
sum = (nums[i] + nums[lo] + nums[hi])
if sum == target: return sum
if abs(sum - target) < min_gap:
res = sum
min_gap = abs(sum - target)
if sum < target:
#while lo < hi and nums[lo] == nums[lo + 1]: lo += 1
lo += 1
else:
#while lo < hi and nums[hi] == nums[hi - 1]: hi -= 1
hi -= 1
return res;