Medium!
題目描述:
給定一個包括 n 個整數的數組 nums
和 一個目標值 target
。找出 nums
中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定數組 nums = [-1,2,1,-4], 和 target = 1. 與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
解題思路:
這道題讓我們求最接近給定值的三數之和,是在之前那道三數之和的基礎上又增加了些許難度,那么這道題讓我們返回一個最接近於給定值的值,所以需要保證當前三數與給定值之間的差的絕對值最小,因此要定義一個變量diff用來記錄差的絕對值,然后還是要先將數組排個序,進而開始遍歷數組,思路跟那道三數之和很相似,都是先確定一個數,然后用兩個指針left和right來滑動尋找另外兩個數,每確定兩個數,求出此三數之和,然后計算和給定值的差的絕對值存在newDiff中,之后和diff比較並更新diff與結果closest即可,代碼如下:
C++參考答案:
1 class Solution { 2 public: 3 int threeSumClosest(vector<int>& nums, int target) { 4 int closest = nums[0] + nums[1] + nums[2]; 5 int diff = abs(closest - target); 6 sort(nums.begin(), nums.end()); 7 for (int i = 0; i < nums.size() - 2; ++i) { 8 int left = i + 1, right = nums.size() - 1; 9 while (left < right) { 10 int sum = nums[i] + nums[left] + nums[right]; 11 int newDiff = abs(sum - target); 12 if (diff > newDiff) { 13 diff = newDiff; 14 closest = sum; 15 } 16 if (sum < target) ++left; 17 else --right; 18 } 19 } 20 return closest; 21 } 22 };