code第一部分数组:第八题 三个元素和最接近给定目标

code第一部分数组:第八题  三个元素和最接近给定目标

 

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).

解决方法1
先排序,然后左右夹逼,复杂度 O(n2)

int threeSumClosest(vector<int>& num, int target)
{
    int result = 0;
    int min_gap = INT_MAX;
    sort(num.begin(), num.end());
    for (auto a = num.begin(); a != prev(num.end(), 2);a = upper_bound(a, prev(num.end(), 2), *a))
    {
        auto b = next(a);
        auto c = prev(num.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;
}

 

posted @ 2017-02-25 22:06  taoliu_alex  阅读(168)  评论(0编辑  收藏  举报