题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
1 2 3
| 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
|
题解
- 类似于三数之和,先对数组进行排序。
- 取第
i 个数,设定 j = i+1 为下一个数,k = size-1 为最右边的数
- 计算三数之和
sum = nums[i] + nums[j] + nums[k],得出差值 abs(sum - target),如果为最小差值小则记录 sum 和最小差值。
- 比较
sum 与目标大小
sum 比 target 大,则 --k。
sum 比 target 小,则 ++j。
sum 等于 target ,则最接近 target 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int size = (int)nums.size(); int minOffset = INT_MAX; int sum = 0; for (auto i = 0; i < size - 2; ++i) { int n1 = nums[i]; int j = i + 1; int k = size - 1; while (j < k) { int n2 = nums[j]; int n3 = nums[k]; int newSum = n1 + n2 + n3; int offset = abs(newSum - target); if (offset < minOffset) { minOffset = offset; sum = newSum; } if (newSum > target) { --k; } else if (newSum < target) { ++j; } else { return target; } } } return sum; }
|