LeetCode 16. 3Sum Closest

问题链接

LeetCode 16. 3Sum Closest

题目解析

给定n个元素的数组和目标值,取三个元素使三数之和最接近目标值,求最接近目标值的三数之和。

解题思路

本题与LeetCode 15. 3Sum,思路一模一样,难度相差不大。

同样的,先将数组排序。固定最小数字,移动左右指针,利用变量 \(diff\) 记录最小的误差值,需要注意一点:与 \(3Sum\) 不同,本题只需输出最接近的和即可,一些限制条件可以去除,比如 \(nums[k]>target\) 这种情况,在 \(3sum\) 中直接跳出循环,但在本题中也是有可能是答案的。

时间复杂度:\(O(n^2)\)

参考代码

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

相似题目

LeetCode 1. Two Sum
LeetCode 15. 3Sum
LeetCode 18. 4Sum


LeetCode All in One题解汇总(持续更新中...)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


posted @ 2018-03-20 17:15  AlvinZH  阅读(247)  评论(0编辑  收藏  举报