Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
We can use the same idea as the previous problem. Sort the list first and then try every triple.
C++ Code:
/*
* func: three_sum_closest
* goal: to find three numbers in a list whose sum is closest to the
given target
* @param num: vector of numbers
* @param target: the given target value
* return: the closest sum
*/
/*
* sort first and try every combination
* complexity: time O(n^2), space O(1)
*/
int threeSumClosest(vector<int> num, int target) {
//If there are less than 2 numbers, return target
if(num.size() <= 2){
return target;
}
//Sort the list first
sort(num.begin(), num.end());
//variable for current max difference
int max_diff = numeric_limits<int>::max();
int ret = numeric_limits<int>::max();
for(int i = 0; i < num.size()-2; ++i){
//Avoid duplicate cases
if(i > 0 && num[i] == num[i-1]){
continue;
}
//Use two iters to find b and c which sum up tp -a
int left = i+1, right = static_cast<int>(num.size())-1;
while(left < right){
int sum = num[i] + num[left] + num[right];
if(abs(sum-target) < max_diff){
max_diff = abs(sum-target);
ret = sum;
}
//If sum is larger than target, we can move right one left to make
//the sum smaller
if(sum > target){
--right;
}else if(sum == target){
return sum;
}else{
++left;
}
}
}
return ret;
}
Python Code:
# func: find three numbers in a list whose sum is closest to the given target
# @param num: input number list
# @param target: target number
# @return: the closest sum
# complexity: time O(n^2), space O(1)
def three_sum_closest(num, target):
if len(num) <= 2:
return target
else:
#Sort the num list first
num.sort()
max = pow(2, 31)
#Iterate from the first
for i in xrange(0, len(num)-2):
#Avoid some duplicate cases
if i > 0 and num[i] == num[i-1]:
continue
else:
#Find from the remaining numbers
left = i+1
right = len(num)-1
while left < right:
sum = num[i] + num[left] + num[right]
if abs(sum - target) < max:
#Update result
result = sum
max = abs(sum - target)
#Choose how to move
if sum < target:
left += 1
elif sum == target:
#This is the best case
return sum
else:
right -= 1
return result
No comments:
Post a Comment