可以不判重,思路统上一道题,比上一道题简单
C++
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans = nums[0]+nums[1]+nums[2];
int n = nums.size();
if(nums.size()<=3) return ans;
for(int i=0;i<n-2;i++){
int l = i + 1, r = n - 1;
if(i>0&&nums[i]==nums[i-1]) continue;
while(l<r){
int res = nums[i]+nums[l]+nums[r];
if(abs(res-target)<abs(ans-target)) ans = res;
if(res>target){
while(r<l&&nums[r]==nums[r-1]) r--;
r--;
}
else if(res<target){
while(r<l&&nums[l]==nums[l+1]) l++;
l++;
}
else return ans;
}
}
return ans;
}
};
Python
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n = len(nums)
if n<3: return
ans = nums[0]+nums[1]+nums[2]
for i in range(n-2):
l, r = i + 1, n - 1
if i>0 and nums[i]==nums[i-1]: continue
while l<r:
res = nums[i]+nums[l]+nums[r]
if abs(res-target)<abs(ans-target): ans = res
if res<target:
while l<r and nums[l]==nums[l+1]: l+=1
l+=1
elif res>target:
while l<r and nums[r]==nums[r-1]: r-=1
r-=1
else: return ans
return ans