題目
給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如
給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
來源:力扣(LeetCode)
思路
首先,定義一個變量 diff 用來記錄差的絕對值;
然後,先對數組排序,開始遍歷數組,思路跟三數之和類似;
其次,可以先確定一個數,用兩個指針 left 和 right 來滑動尋找另外兩個數,每確定兩個數,求出此三數之和,然後求出與給定值的差的絕對值存入 newDiff 中;
最後,和 diff 比較並更新 diff 和結果 closest 。
C++代碼
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target)
{
int closest = nums[0] + nums[1] + nums[2];
int diff = abs(closest - target);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i)
{
int left = i + 1, right = nums.size() - 1;
while (left < right)
{
int sum = nums[i] + nums[left] + nums[right];
int newDiff = abs(sum - target);
if (diff > newDiff)
{
diff = newDiff;
closest = sum;
}
if (sum < target)
++left;
else --right;
}
}
return closest;
}
};