ThreeSumCloest question
Introduction
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).
Solution 1: Brute force
it should be easy to implement it but the complexity is really high (e.g O(n^3)).
Solution 2 : double pointer and sorting
sorting is pretty essential to this kind of question, since we can pruning many impossible cases.
class Solution {
public:
int threeSumClosest(vector<int> &nums,int target)
{
//return 0 if the size is less than 3
if (nums.size()<3)
{
return 0;
}
//return the sum of the nums if the size is equal to 3
if (nums.size()==3)
{
return nums[0]+nums[1]+nums[2];
}
//sorting the nums
sort(nums.begin(), nums.end());
//initialize the minimum difference
int minDiff = abs(target - nums[0] - nums[1] - nums[2]);
//return the target if the minimum difference is equal to 0
if(minDiff == 0)
{
return target;
}
int diff = 0;
int currentSum = 0;
//initialize the result pick up the sum of the first three nums
int result = nums[0]+nums[1]+nums[2];
for(int i = 0; i<nums.size();i++)
{
int L = i+1;
int R = nums.size()-1;
while(L<R)
{
currentSum = nums[i]+nums[L]+nums[R];
diff = abs(target-currentSum);
if(diff == 0)
{
return target;
}
if(diff<minDiff)
{
minDiff = diff;
result = currentSum;
}
if(currentSum > target)
{
R--;
}
else
{
L++;
}
}
}
return result;
}
};