qingcheng奕  

https://oj.leetcode.com/problems/3sum-closest/

给一列数和target,在这一列数中找出3个数,使其和最接近target,返回这个target。

一般思路是 n*n*n,优化的话,如下:

先给数排序,然后对第一个数进行遍历 i,第二个数为i+1,第三个数为len-1,看得出的和于target的比较。如果小于target,则第二个数下标++,如果大于target,则第三个数下标--。

class Solution {
public:
    int threeSumClosest(vector<int> &num, int target) {
        int len = num.size();
        if(len<3)
            return 0;
        if(len == 3)
            return num[0]+num[1]+num[2];

        sort(num.begin(),num.end());
        int nearAns = num[0]+num[1]+num[2];
        for(int i = 0;i<len;i++)
        {
            int j = i+1;
            if(j>len-2)
                break;
            int k = len-1;
            
            while(j<k)
            {
                int sum = num[i]+num[j]+num[k];
                if(sum == target)
                    return target;
                if(sum<target)
                {
                    if(abs(target - sum) < abs(target - nearAns))
                        nearAns = sum;
                    j++;
                }
                if(sum>target)
                {
                    if(abs(target - sum) < abs(target - nearAns))
                        nearAns = sum;
                    k--;
                }
            }
        }
        return nearAns;
    }
};

 

posted on 2014-06-23 15:21  qingcheng奕  阅读(125)  评论(0编辑  收藏  举报