笔试题29. LeetCode OJ (16)

来源:互联网 发布:英文说明书翻译软件 编辑:程序博客网 时间:2024/05/03 19:40

上个题绞尽脑汁的思考测试终于弄出结果了,所以遇到这个题的时候感觉松了口气。这个题要求三个数的和最接近所给的数,

意思就是找一个数组中三个数的和,使它最接近你所给的目标。我的思路是遍历,因为不遍历完所有情况根本就无法推测结果,难

道大家还有别的做法能减少计算的次数吗,我猜想如果排序后还是有可能的排序后能推测出数字的和范围,这个办法应该可行的,

但是仔细想想的话还是比较麻烦,需要考虑到的细节又会很多,因为我们需要的三个数并不一定是连续的三个数的,而且我们并不

知道"最接近的程度"是多大,这样也是在盲目的测试,所以我觉得我还是采用遍历的做法。

  • 这个题需要注意的是若三个数的和等于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;    }};
但是我还是有一种冲动觉得排序在查找那种做法是有可能的,如果有谁知道思路请告诉我一下吧,谢谢。我自己也下去再

好好思考一下吧。

当然遍历的做法是被接受的...



0 0
原创粉丝点击