16. 3Sum Closest(题目链接)
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
核心思想:two pointer 过滤掉一些没有必要比较的点
本质上是枚举所有可能的情况,同时去掉一些没有必要比较的点。
两个指针从两边向中间聚,可以找出小范围内(这个小范围是第一个数确定以后,所有可能的范围)的最大值或者最小值。为什么会快?删除掉了一些没必要比较的点,比如target=10,我们计算出当前的三个数的和是11,那么和比11大的三个数就没有必要枚举了。
c++:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int closeSum=nums[0]+nums[1]+nums[2];
int AbsDifference=abs(closeSum-target);
sort(nums.begin(), nums.end());
for(int i=0; i<=nums.size()-3; i++) {
int secondNum = i+1;
int thirdNum = nums.size()-1;
int tempSum;
while(secondNum<thirdNum) {
tempSum = nums[i]+nums[secondNum]+nums[thirdNum];
if(abs(tempSum-target)<AbsDifference) {
AbsDifference = abs(tempSum - target);
closeSum = tempSum;
}
if(tempSum<target) {
secondNum++;
}
else if(tempSum>target) {
thirdNum--;
}
else {
return target;
}
}
}
return closeSum;
}
};
python
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
rlt = nums[0] + nums[1] +nums[2]
for i in range(len(nums) - 2):
first, second, third = i, i + 1, len(nums) - 1
while second < third:
temp = nums[first] + nums[second] + nums[third]
if abs(temp - target) < abs(rlt - target):
rlt = temp
if temp < target:
second += 1
elif temp > target:
third -= 1
else:
return target
return rlt
3SumClosest算法解析

本文深入解析3SumClosest算法,旨在寻找数组中三个数的组合,使其和最接近给定目标值。通过双指针技巧,文章详细阐述如何高效地遍历所有可能的组合,同时避免不必要的比较,实现快速求解。

被折叠的 条评论
为什么被折叠?



