目录
题目描述:
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:
先从小到大排序,然后定三个索引,i = 0, j = i+1, k = nums.size() -1,以i 为基准,向右移动 j 或者向左移动 k,找到最接近目标的和,如果和小于target, 则为了增大和,向右移动 j, 反之,向左移动 k。
关键点,需要两个变量记录总和、接近程度(可以去掉)。
C++代码:
执行用时:4 ms, 在所有 C++ 提交中击败了98.09%的用户
内存消耗:9.6 MB, 在所有 C++ 提交中击败了49.58%的用户
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int nums_len = nums.size();
// 排序
sort(nums.begin(), nums.end());
int closest = nums[0] + nums[1] + nums[2]; // 初始总和
int diff = abs(closest - target); // 初始距离
for (int i = 0; i < nums_len-2; i++) // 遍历有序数组,将i视为第一个数字,寻找另外两个数字
{
int L = i + 1;
int R = nums_len - 1;
while (L < R)
{
int sum_val = nums[i] + nums[L] + nums[R];
if (abs(sum_val-target) < diff) // 如何更接近,则更新总和closest和距离diff
{
closest = sum_val;
diff = abs(sum_val-target);
}
if (sum_val < target) L++; // 去下一个位置,如果总和小了,移动左边。
else if (sum_val > target) R--;
else return target;
}
}
return closest;
}
};
python代码:
执行用时:48 ms, 在所有 Python 提交中击败了85.54%的用户
内存消耗:13.2 MB, 在所有 Python 提交中击败了12.45%的用户
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 排序
nums.sort()
# 赋值
closest_sum = nums[0] + nums[1] + nums[2]
diff = abs(closest_sum - target)
for i in range(len(nums)-2):
L = i + 1
R = len(nums) - 1
while L < R:
sum_val = nums[i] + nums[L] + nums[R]
if abs(sum_val - target) < diff: # 是否需要更新closest_sum和diff
closest_sum = sum_val
diff = abs(sum_val - target)
# 下一个位置
if sum_val < target: L = L + 1
elif sum_val > target: R = R - 1
else: return target
return closest_sum