Decription
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(C++)
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size() < 3) return 0;
int closest = nums[0]+nums[1]+nums[2];
sort(nums.begin(), nums.end());
for(int first = 0 ; first < nums.size()-2 ; ++first) {
if(first > 0 && nums[first] == nums[first-1]) continue;
int second = first+1;
int third = nums.size()-1;
while(second < third) {
int curSum = nums[first]+nums[second]+nums[third];
if(curSum == target) return curSum;
if(abs(target-curSum)<abs(target-closest)) {
closest = curSum;
}
if(curSum > target) {
--third;
} else {
++second;
}
}
}
return closest;
}
};
Solution 2(C++)
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size()<3) return 0;
sort(nums.begin(), nums.end());
int res=nums[0]+nums[1]+nums[2];
for(int first=0; first<nums.size()-2; first++){
int curtarg = target-nums[first];
int second = first+1, third = nums.size()-1;
while(second < third){
int curres = nums[first]+nums[second]+nums[third];
res = abs(curres-target) < abs(res-target) ? curres : res;
if(nums[second]+nums[third] == curtarg) return curtarg+nums[first];
else if(nums[second]+nums[third] < curtarg) second++;
else third--;
}
}
return res;
}
};
算法分析
事先排序,然后进行两重循环,遍历找到符合要求的值就可以了。
程序分析
略。