3Sum Closest
Solution 1
从题意和数据量上来看,本题基本就是前一个3Sum的变体。有几个主要的区别:输出是和值而非三元组,因此不需要考虑重复问题;考虑对小目标差异而非绝对值,因此需要调整状态维护量。整体还是使用双指针维护遍历方法,但是不需要考虑重复条件,每一个可行元组遍历时,检查和值和目标值的差距,寻找最小差距。
- 时间复杂度: O ( N 2 ) O(N^2) O(N2), N N N为数字个数
- 空间复杂度: O ( log N ) O(\log N) O(logN), N N N为数字个数
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = 0, dis = INT_MAX;
for (int posA = 0; posA < nums.size(); ++posA) {
if (posA > nums.size() - 3) {
break;
}
int posB = posA + 1;
int posC = nums.size() - 1;
// 双指针维护
while (posB < posC) {
int sum = nums[posA] + nums[posB] + nums[posC];
if (abs(target - sum) < abs(dis)) {
dis = target - sum;
ans = sum;
}
// 负的一项太大了,选一个更小的
else if (sum < target) {
posB++;
}
// 正的项太大了,选个更小的
else {
posC--;
}
}
}
return ans;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums_ordered = sorted(nums)
dis = 1e5
for posA in range(len(nums_ordered) - 2):
posB = posA + 1
posC = len(nums_ordered) - 1;
while posB < posC:
nums_sum = nums_ordered[posA] + nums_ordered[posB] + nums_ordered[posC]
if abs(nums_sum - target) < abs(dis):
dis = nums_sum - target
ans = nums_sum
elif nums_sum < target:
posB += 1
else:
posC -= 1
return ans