(16)3Sum Closest
題目:在一個數組裏找到和目標結果最爲接近的三個數字的和,返回此和數。
例子:
所給數組爲 S = {-1,2,1,-4},同時目標結果target = 1。
數組中最接近目標結果的三個數字之和爲2。(-1 + 2 + 1 = 2)。
根據題目的特點,尤其是有第15題的鋪墊,整個題目就相當於把和數等於0改成可變的和數的情況,同時使用std::min,和std::abs的方法將和數與target的差計算出來,獲取最小的即可。
下面是代碼:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int len = nums.size();
if(len == 0){
return 0;
}
sort(nums.begin(), nums.end());
int i, j, k;
int minnum = 99999;
for(i=0;i<len;i++){
if(i!=0){
if(nums[i] == nums[i-1]){
continue;
}
}
int targetnum = target;
targetnum -= nums[i];
j = i + 1;
k = len - 1;
while(j<k){
while(j<k&&j!=(i+1)&&nums[j]==nums[j+1]){
j ++;
}
while(j<k&&k<(len-1)&&nums[k]==nums[k-1]){
k --;
}
if(nums[j] + nums[k] == targetnum){
printf("%d %d %d\n",nums[i],nums[j],nums[k]);
return target;
}
else if(nums[j] + nums[k] < targetnum){
if(abs(target - minnum)< abs(targetnum - nums[j] - nums[k])){
minnum = minnum;
}
else{
minnum = nums[i] + nums[j] + nums[k];
}
j ++;
}
else{
if(abs(target - minnum)< abs(targetnum - nums[j] - nums[k])){
minnum = minnum;
}
else{
minnum = nums[i] + nums[j] + nums[k];
}
k --;
}
}
}
return minnum;
}
};