説明
<Nの整数の指定された配列と標的NUMSターゲットを含みます。NUMSは三つの整数を特定し、そのような彼らの最も近いことをターゲットにしています。3つの数字とリターン。各グループは唯一の答えのみ入力があることを前提としています。
例
のアイデア
三の数の最適化加速するのではなく、注意を払う(悪い内部だけでなく、ポインタの移動を容易にするための最初の2つのポインタ[ソート]スルー用)
答え
- パイソン
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res=nums[0]+nums[1]+nums[2]
n=len(nums)
for i in range(len(nums)-2):
g=nums[i]+nums[i+1]+nums[i+2]
if g>=target: #越界问题,加速,大于,之后更大,就直接返回
if abs(g-target)<abs(res-target):
res=g
return res
h=nums[i]+nums[n-1]+nums[n-2]
if h==target: return h
if h<target: #加速,小于,之后更大,还可以靠近
res=nums[i]+nums[n-1]+nums[n-2]
continue
a=i+1
b=len(nums)-1
while a<b:
t=nums[i]+nums[a]+nums[b]
if abs(t-target)<abs(res-target):
res=t
if t<target: a+=1
if t>target: b-=1
if t==target: return t
return res
- C ++
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int res = nums[0]+nums[1]+nums[2];
int n=nums.size();
for (int i=0; i<n-2; i++)
{
int g=nums[i]+nums[i+1]+nums[i+2];
if (g>=target)
{
if (abs(g-target)<abs(res-target))
res=g;
return res;
}
int h = nums[i]+nums[n-1]+nums[n-2];
if (h<target)
{
res=h;
continue;
}
if (h==target) return h;
if (i-1>0 && nums[i]==nums[i-1]) continue;//去重
int a=i+1,b=n-1;
while (a<b)
{
int t = nums[i]+nums[a]+nums[b];
if (abs(t-target)<abs(res-target))
res=t;
if (t<target) a++;
if (t>target) b--;
if (t==target) return t;
}
}
return res;
}
};