上个题绞尽脑汁的思考测试终于弄出结果了,所以遇到这个题的时候感觉松了口气。这个题要求三个数的和最接近所给的数,
意思就是找一个数组中三个数的和,使它最接近你所给的目标。我的思路是遍历,因为不遍历完所有情况根本就无法推测结果,难
道大家还有别的做法能减少计算的次数吗,我猜想如果排序后还是有可能的排序后能推测出数字的和范围,这个办法应该可行的,
但是仔细想想的话还是比较麻烦,需要考虑到的细节又会很多,因为我们需要的三个数并不一定是连续的三个数的,而且我们并不
知道"最接近的程度"是多大,这样也是在盲目的测试,所以我觉得我还是采用遍历的做法。
- 这个题需要注意的是若三个数的和等于target的话,那我们的工作不用继续了,直接返回target就行。
遍历的做法代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target)
{
int gap = 0; //差距,即和target的接近程度
int sum = 0;
int len = nums.size(); //元素个数
if(len < 3)
{
return -1;
}
//初始化gap
sum = nums[0]+nums[1]+nums[2];
gap = target > sum ? (target-sum):(sum-target);
for(int begin = 0 ; begin < len-2; ++begin)
{
if(begin > 0 && nums[begin] == nums[begin-1])
{
++begin;
continue;
}
int pos1 = begin+1;
while(pos1 < len-1)
{
int pos2 = pos1+1;
while(pos2 < len)
{
int tmpsum = nums[begin] + nums[pos1]+nums[pos2];
if(tmpsum == target)
{
return target;
}
else if(abs(tmpsum - target) < gap)
{
sum = tmpsum;
gap = abs(tmpsum - target);
}
++pos2;
}
++pos1;
}
}
return sum;
}
};
但是我还是有一种冲动觉得排序在查找那种做法是有可能的,如果有谁知道思路请告诉我一下吧,谢谢。我自己也下去再
好好思考一下吧。
当然遍历的做法是被接受的...