&LeetCode0016& 最接近的三數之和

題目

給定一個包括 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章