【1日1問】 16. 最も近い3つの数字の和

16. 最も近い 3 つの数字の合計

トピックの説明

長さ n の整数配列 nums とターゲット値 target が与えられます。合計が目標に最も近くなるように、nums から 3 つの整数を選択してください。

これら 3 つの数値の合計を返します。

入力の各セットに対してソリューションが 1 つだけ存在すると想定されます。

例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

例 2:

输入:nums = [0,0,0], target = 1
输出:0

ヒント:

3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= ターゲット <= 104

問題解決のアイデア

アイデア: 3 つの数値の合計と同じですが、入力の各セットに対して解が 1 つだけあるため、3 つの数値の合計よりも単純です。まず配列をソートし、次にポインタを使用して最初の数値を走査し、次にダブル ポインタを使用して残りの 2 つの数値を走査します。1 つのポインタは前から後ろに走査し、もう 1 つのポインタは後から前に走査します。トリプルが走査されるたびに、合計が 1 回判定され、最小の結果が記録されます。比較値であるため、res を使用して最小の 3 つの数値の合計を記録し、次に sum を使用して現在の 3 つの数値の合計と絶対値を記録します。ターゲットと 2 つの差を比較します。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int res=nums[0]+nums[1]+nums[2];
        for(int i=0;i<n;i++)
        {
            int left=i+1,right=n-1;
            while(left<right)
            {
                int sum=nums[i]+nums[left]+nums[right];
                //比较差值则两者均比较差值
                if(abs(target-sum)<abs(target-res))
                    res=sum;
                if(sum==target)
                    return target;
                else if(sum>target)
                    right--;
                else 
                    left++;
            }
        }
        return res;
    }
};

要約: 2 つの数値の合計、3 つの数値の合計、および 4 つの数値の合計には類似点と相違点があり、これらを層ごとに要約する必要があります。

おすすめ

転載: blog.csdn.net/qq_43779149/article/details/131633480