LeetCode(C++)刷题计划:16-最接近的三数之和

16-最接近的三数之和

@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com

Category Difficulty Pass rate Tags Companies
algorithms Medium 41.91% array / two-pointers bloomberg

1. 题目

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-121-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest/

2. 解法

2.1 解法一:双指针法

  1. 与第15题三数之和类似。三数之和是当和为 target 是我们需要的值,此题则是sumtarget|sum - target|最小时,是我们需要的值。
  2. 其余部分和三数之和相同。参考链接:15 - 三数之和

执行用时: 12 ms, 在所有 cpp 提交中击败了 72.29% 的用户
内存消耗: 8.7 MB, 在所有 cpp 提交中击败了 87.01% 的用户

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        if (nums.size() < 3)
            return 0;
        sort(nums.begin(), nums.end());
        int sum;
        long res = INT_MAX;
        for (auto k = 0; k < nums.size() - 2; ++ k) {
            int l = k + 1;
            int r = nums.size() - 1;
            while (l < r) {
                sum = nums[k] + nums[l] + nums[r];
                if (abs(sum - target) < abs(res - target))
                        res = sum;
                if (sum < target) {
                    while (l < r && nums[l] == nums[++ l]) { }
                }
                else if (sum > target) {
                    while (l < r && nums[r] == nums[-- r]) { }
                }
                else {
                    return target;
                }
            }
        }
        return res;
    }
};

posted on 2020-01-11 10:23  神奇小海螺  阅读(86)  评论(0编辑  收藏  举报

导航