lintcode 最接近的三数之和

给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
题目链接:http://www.lintcode.com/zh-cn/problem/3sum-closest/#

首先对数组进行排序,如果第一个数就比目标值的三分之一大,那么久返回前三个数的和,如果最后三个数比目标值的三分之一小,就返回最后三个数的和。如果不是以上两种情况,遍历数组。
这里也是有三个指针,如果第一个指针(i)指向的数比目标值的三分之一小,直接跳过(第一个指针指向的是三个数中最大的),如果和下一个数一样,也跳过。然后就是把三个数的和和target进行比较,分为两种情况,遇到重复的数同样是跳过。

class Solution {
public:    
    /**
     * @param numbers: Give an array numbers of n integer
     * @param target: An integer
     * @return: return the sum of the three integers, the sum closest target.
     */
    int threeSumClosest(vector<int> nums, int target) {
        // write your code here
        sort(nums.begin(),nums.end());
        if (nums[0] >= target/3) return nums[0] + nums[1] + nums[2];
        if (nums[nums.size()-1] <= target/3) return nums[nums.size()-1] + nums[nums.size()-2] + nums[nums.size()-3];
        int res;
        int d = INT_MAX;
        for (int i = 2;i < nums.size();i++) {
            if (nums[i] < target/3 || i+1 < nums.size() && nums[i] == nums[i+1]) continue;
            for (int j = 0,k = i - 1,sum = nums[j] + nums[k],temp = target - nums[i];j < k;sum = nums[j] + nums[k]) {
                if (sum < temp || j > 0 && nums[j] == nums[j-1]) {
                    if (temp - sum < d) {
                        d = temp -sum;
                        res = sum + nums[i];
                    }
                    j++;
                }
                else if (sum > temp || k+1 < i && nums[k] == nums[k+1]) {
                    if (sum - temp < d) {
                        d = sum - temp;
                        res = sum + nums[i];
                    }
                    k--;
                }
                else return target;
            }
        }
        return res;
    }
};
    原文作者:yzawyx0220
    原文地址: https://www.jianshu.com/p/fc690dd9ab33
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞