LeetCode 16

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

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

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

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

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

  • 这个题需要注意的是若三个数的和等于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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值