📅  最后修改于: 2023-12-03 15:42:13.971000             🧑  作者: Mango
本题为Gate IT 2005的第8个问题,测试程序员的数据结构和算法知识。
给定一个数组和一个整数x,从数组中找出三个数的和最接近x的那一组,并返回它们的和。
实现函数:
def closest_sum(arr: List[int], x: int) -> int:
pass
一个整数,代表三个数的和最接近x的那一组并返回它们的和。
输入:
arr = [-1, 2, 1, -4]
x = 1
输出:
2
解释:
最接近x(1)的是-1+2+1=2
输入:
arr = [-1, 2, 1, -4]
x = 3
输出:
2
解释:
最接近x(3)的是-1+2+1=2
输入:
arr = [1, 1, 1, 0]
x = -100
输出:
2
解释:
最接近x(-100)的是1+1+1=3,但是由于题目要求返回它们的和,因此答案为1+1=2
本题需要找到三个数的和最接近x的那一组,因此需要对数组进行遍历,取出三个数的组合,然后比较它们的和与x的大小关系,找到最接近的那一组。
具体思路如下:
from typing import List
def closest_sum(arr: List[int], x: int) -> int:
arr.sort()
n, inf = len(arr), float('inf')
min_diff, res = inf, 0
# i从0到n-3,j从i+1到n-2,k从j+1到n-1
for i in range(n-2):
for j in range(i+1, n-1):
p, q = j+1, n-1
while p < q:
sum_ = arr[i] + arr[j] + arr[p] + arr[q]
diff = sum_ - x
if abs(diff) < min_diff:
min_diff = abs(diff)
res = sum_
if diff < 0:
p += 1
elif diff > 0:
q -= 1
else:
return x
return res
本题考察了数组的排序、双指针等知识点,实现上比较简单,但需要一定的思考,特别是要考虑到所有情况,比如数组中可能有重复元素、可能存在多个解等。