问题链接
题目解析
给定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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
来源:https://www.cnblogs.com/AlvinZH/p/8610711.html