16. 最接近的三数之和
题目链接
这道题和三数之和类似,排序后,用两个指针向中间逼近,如果大于结果就second-1,如果小于first-1。
C++:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int n = nums.size();
int ans = -10000;
for(int i = 0; i < n; i++)
{
int first = 0, second = n-1;
while(first < i && second > i)
{
int sum = nums[first]+nums[i]+nums[second];
//cout << sum << endl;
if(abs(target-ans) > abs(target-sum))
{
ans = sum;
}
if(sum > target) second--;
else first++;
}
}
return ans;
}
};
python:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n = len(nums)
ans = -10000
for i in range(0, n):
first = 0
second = n-1
while first < i and second > i:
sum1 = nums[first]+nums[i]+nums[second]
if abs(target-ans) > abs(target-sum1):
ans = sum1
if sum1 > target: second-=1
else: first+=1
return ans
这道题因为允许有重复元素,因此如果有去重操作有机会更快,如果测试数组没有重复元素,会更慢。
C++:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int n = nums.size();
int ans = -10000;
for(int i = 0; i < n; i++)
{
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int first = i+1, second = n-1;
while(first < second)
{
int sum = nums[first]+nums[i]+nums[second];
if(abs(target-ans) > abs(target-sum))
{
ans = sum;
}
if(sum > target)
{
second = second-1;
while(first < second && nums[second] == nums[second+1])
second--;
}
else
{
first = first+1;
while(first < second && nums[first] == nums[first-1])
first++;
}
}
}
return ans;
}
};
但是加上去重之后的python版本,并没有更快,反而更慢了
python:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n = len(nums)
ans = -10000
for i in range(0, n):
if i > 0 and nums[i] == nums[i-1]:
continue
first = i+1
second = n-1
while first < second:
sum1 = nums[first]+nums[i]+nums[second]
if abs(target-ans) > abs(target-sum1):
ans = sum1
print(first,second)
if sum1 > target:
second = second-1
while first < second and nums[second] == nums[second+1]:
second-=1
else:
first = first+1
while first < second and nums[first] == nums[first-1]:
first+=1
return ans
如果对你有帮助的话,请点个赞哦!