亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++如何解決最近三數之和問題

發布時間:2022-10-17 17:46:15 來源:億速云 閱讀:133 作者:iii 欄目:編程語言

這篇文章主要介紹了C++如何解決最近三數之和問題的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++如何解決最近三數之和問題文章都會有所收獲,下面我們一起來看看吧。

最近三數之和

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

這道題讓我們求最接近給定值的三數之和,是在之前那道 3Sum 的基礎上又增加了些許難度,那么這道題讓返回這個最接近于給定值的值,即要保證當前三數和跟給定值之間的差的絕對值最小,所以需要定義一個變量 diff 用來記錄差的絕對值,然后還是要先將數組排個序,然后開始遍歷數組,思路跟那道三數之和很相似,都是先確定一個數,然后用兩個指針 left 和 right 來滑動尋找另外兩個數,每確定兩個數,求出此三數之和,然后算和給定值的差的絕對值存在 newDiff 中,然后和 diff 比較并更新 diff 和結果 closest 即可,代碼如下:

解法一:

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;
    }
};

我們還可以稍稍進行一下優化,每次判斷一下,當 nums[i]*3 > target 的時候,就可以直接比較 closest 和 nums[i] + nums[i+1] + nums[i+2] 的值,返回較小的那個,因為數組已經排過序了,后面的數字只會越來越大,就不必再往后比較了,參見代碼如下:

解法二:

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) {
            if (nums[i] * 3 > target) return min(closest, nums[i] + nums[i + 1] + nums[i + 2]);
            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;
    }
};

關于“C++如何解決最近三數之和問題”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++如何解決最近三數之和問題”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

承德市| 元朗区| 威海市| 鸡西市| 宁都县| 军事| 开原市| 定州市| 环江| 盐城市| 湘乡市| 余姚市| 巴林左旗| 德阳市| 海原县| 禄劝| 阳高县| 磐石市| 滨州市| 启东市| 武义县| 义乌市| 邯郸县| 休宁县| 准格尔旗| 鹤岗市| 徐汇区| 同仁县| 明光市| 内丘县| 新乐市| 汉源县| 满城县| 元氏县| 垣曲县| 腾冲县| 中西区| 噶尔县| 思南县| 凤翔县| 景泰县|