------------------------如果有文章有问题,烦请不吝指出,共同探讨学习。谢谢^_^ !
【题目】
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)
【题意】
给定一个由n个整数组成的数组,在S中找到3个整数,使之和最接近给定数target。返回三个整数的和。您可以假设每个输入都有一个解决方案。
例如,给定数组S={-1 2 1-4},而target=1。最接近目标的和是2。(-1+2+1=2)
【分析】
这道题让我们求最接近给定值的三数之和,并不需要返回三个数的位置,只需要返回这个最接近target的数是多少。首先对数组进行排序,这样子更加方便我们循环,控制三个数只和sum越来越接近给定的target。给定排序后的数组三个指针,第一个a、第二个b、最后一个c,第一个iterator控制外围的循环,如果遍历到了倒数第二个元素就停止。算出三个数的和sum、sum与target的绝对值,并使用一个变量gap来记录sum与target之差的绝对值,如果小于目前的min_gap就取代它。如果sum小于target,将b向后移动,由于是排序了的,那么结果一定会变大。如果sum大于target了,就将c后移,结果一定会变小一点,直到两个指针相遇停止内部的循环,开始新一轮的外围循环,直到遍历到了倒数第二个元素。
【代码】
int threeSumClosest(vector<int>& nums, int target){
int result = 0;
int min_gap = INT_MAX;//最小的差
sort(nums.begin(),nums.end());//排序
//到了倒数第二个就不用再往下走了。
for(auto a=nums.begin();a!=prev(nums.end(),2);++a){
auto b=next(a);//auto代表的类型由“=”后面的类型决定。
//随机迭代器的end()返回的是数组的最后一个值的后一个。这儿C表示的是最后一个
auto c = prev(nums.end());
while (b<c){
const int sum= *a+ *b + *c;
const int gap = abs(sum-target);
if (gap<min_gap){
result = sum;
min_gap = gap;
}
if (sum<target)
++b;
else
--c;
}
}
return result;
}