【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 つの数値の合計には類似点と相違点があり、これらを層ごとに要約する必要があります。