[leetcode] 16. 3Sum Closest 解题报告

题目链接:https://leetcode.com/problems/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思路差不多,如果暴力DFS搜索,其时间复杂度将会是O(n^3)。我们可以先挑出一个数来,然后问题将同样退化为2sum问题,即找出两个数等于另外一个数,其时间复杂度将会降为O(n^2)。首先将数组排序,然后使用左右指针,寻找最靠近target的数值。

代码如下:

class Solution {
public:
    void twoSum(vector<int>& nums, int left, int target, int& result)
    {
        int val = nums[left-1];
        int right = nums.size() -1;
        while(left < right)
        {
            int value = nums[left] + nums[right] + val - target;//距离targe的距离
            result = abs(result) > abs(value)?value:result;
            if(value > 0) right--;
            else left++;
        }
    }
    int threeSumClosest(vector<int>& nums, int target) {
        int len = nums.size(), result = INT_MAX;
        sort(nums.begin(), nums.end());
        for(int i =0; i< len-1 ;i++)//依次挑选出一个数来
            twoSum(nums, i+1, target, result);
        return result + target;//因为result是距离,所以需要加上target的值
    }
};


你可能感兴趣的:(LeetCode,算法,array)