【LeetCode】 16. 3Sum Closest 解题小结

题目: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).

这个题目应该说是上一题 3Sum的一般化,因为题目说明输入中肯定能有一个解,初始化sum就前三个元素就好了。查找方式和3Sum一样,不过判断的时候,如果sum = target,那么就可以直接返回了。如果sum到target的距离小,那么最小和更新,否则根据Sum在target左边还是右边分别left++或right--。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        if(nums.size() < 3) return 0;
        sort(nums.begin(), nums.end());
        int minT = nums[0]+nums[1]+nums[2];
        for(int i = 0 ; i < nums.size()-2; ++i){
            if (i > 0 && nums[i] == nums[i-1])continue;
            int a = nums[i];
            int left = i+1;
            int right = nums.size()-1;
            while(left < right){
                int b = nums[left];
                int c = nums[right];
                if (a+b+c-target == 0) {
                    minT = a+b+c;
                    return minT;
                }
                if (abs(a+b+c-target) < abs(minT-target)){
                    minT = a+b+c;
                }
                if (a+b+c-target < 0){
                    left++;
                }
                if (a+b+c-target > 0){
                    right--;
                }
            }
        }
        return minT;
    }
};

 

posted on 2016-08-28 09:58  医生工程师  阅读(157)  评论(0编辑  收藏  举报

导航