# 16.最接近的三数之和

## 问题描述
[16.最接近的三数之和](https://leetcode.cn/problems/3sum-closest/)

## 解题思路
暴力解法，三重循环，时间复杂度为$\Theta(n^3)$;

注意到本题不关注数组中元素的初始索引，因此可以考虑利用双指针来降低时间复杂度:
首先将数组排序，最外层`i`从0遍历到`nums.size() - 3`，内层循环采用相向双指针`l`，`r`从两端向中间靠拢，并且要注意如何去重，(当然，此题可以不关注)。

## 代码
```cpp
class Solution {
  private:
    int mcmp(int a, int b, int target) {
        if (abs(a - target) < abs(b - target))
            return true;
        else
            return false;
    }

  public:
    int threeSumClosest(vector<int> &nums, int target) {
        int res = 0;
        std::sort(nums.begin(), nums.end());
        int sum = 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 l = i + 1, r = nums.size() - 1;
            while (l < r) {
                if (nums[i] + nums[l] + nums[r] == target)
                    return target;
                else if (nums[i] + nums[l] + nums[r] < target) {
                    if (mcmp(nums[i] + nums[l] + nums[r], sum, target))
                        sum = nums[i] + nums[l] + nums[r];
                    while (l < nums.size() - 2 && nums[l] == nums[l + 1])
                        l++;
                    l++;
                } else {
                    if (mcmp(nums[i] + nums[l] + nums[r], sum, target))
                        sum = nums[i] + nums[l] + nums[r];
                    while (r > 2 && nums[r] == nums[r - 1])
                        r--;
                    r--;
                }
            }
        }
        return sum;
    }
};
```


