3Sum Closest

来源:互联网 发布:阿里云的cdn怎么样 编辑:程序博客网 时间:2024/04/30 12:54
-----QUESTION-----

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

-----SOLUTION-----

class Solution {public:    int threeSumClosest(vector<int> &num, int target) {        sort(num.begin(), num.end());        int j;        int k;        int sum;        int diff;        int min_diff = INT_MAX;        int local_target;                for(int i = 0; i < num.size()-2; i++)        {            local_target = target-num[i];            j = i+1;            k = num.size()-1;            while(j<k){                sum = num[j]+num[k];                if(sum == local_target)                {                    return target;                }                else if(sum < local_target)                {                    diff = local_target - sum;                    if(diff < abs(min_diff)) min_diff = diff;                    j++;                }                else                {                    diff = sum - local_target;                    if(diff < abs(min_diff)) min_diff = -diff;                    k--;                }            }        }        return target-min_diff;    }};

也可以使用以下递归的方法

class Solution {public:    int threeSumClosest(vector<int> &num, int target) {        sort(num.begin(), num.end());        inferior = INT_MAX;        dfs(num, 0, 0, target);        return target-inferior;    }    void dfs(vector<int> &num, int startIndex, int depth, int target)    {        if(depth == 2)        {            int i = startIndex;            for(; i < num.size() && num[i] < target; i++)            {}            if(num[i]-target < abs(inferior)) inferior = target-num[i];            if(i>startIndex && target - num[i-1] < abs(inferior)) inferior = target - num[i-1];            return;          }        for(int i = startIndex;i<num.size()-depth; i++)        {            dfs(num, i+1, depth+1, target-num[i]);        }    }private:    int inferior;};

0 0