leetcode 3Sum Closest

题目描述:
给定一个包含n个整数的数组S和目标整数target,在S中找3个整数,使得这3个整数的和最接近target
题目来源
http://oj.leetcode.com/problems/3sum-closest/
题目分析:
先对数组排序,然后枚举最小的数n1,对于第二和三个数,用两个索引l和r从两端往中间夹击找,找最接近target - n1的两个数,可以通过“求在一个数组中找两个数,使这两个数的和最接近目标整数newTarget”。
正确性说明,假设排好序的数组为S 1,S 2...S i...S j...S n,假定最终Si + Sj最接近目标整数newTarget
(1)若Si + Sj < newTarget 那么S i-k + S < newTarget,S i + S j+k  > newTarget(如果:S i + S j+k  < newTarget,那么S i和S j不是最优值)
当l先到达i时,S i + S j+k > newTarget,r会减小至j;当r先到达j时,S i-k + S j < newTarget,l会增加至i。
(2)若Si + Sj > newTarget 那么S i + S j+k  > newTarget,S i-k + S < newTarget(如果:S i-k + S > newTarget,那么Si和Sj不是最优值)
当l先到达i时,S i + S j+k > newTarget,r会减小至j;当r先到达i时,S i-k + S j < newTarget,l会增加至i。
所以总会找到最优值
时间复杂度:O(n^2)
示例代码:
int threeSumClosest(vector<int> &num, int target) {

    int len = num.size();

    int closestSum = 2147483647, result;



    sort(num.begin(), num.end());

    for(int i = 0; i != len - 2; ++i) {

        int l = i + 1, r = len - 1;

        while(l < r) {

            int tmpSum = num[l] + num[r] + num[i];

            if(abs(tmpSum - target) < closestSum) {

                closestSum = abs(tmpSum - target);

                result = tmpSum;

            }

            tmpSum > target ? --r : ++l;

        }

    }



    return result;

}

 

你可能感兴趣的:(LeetCode)