找三个数最接近目标值
题目: s = [-1, 2, 1, -4], target = 0 。。 我们要做的就是从s中找出三个数,和加起来最接近0。。 怎么做呢??
分析:
看到这种题,数字不多,用蛮力
我的想法是:
第一步: 对s列表中的值进行排序
第二步: 固定一个值,然后设两个指针,一个指向固定值之后的值,一个执行列表的末尾值
第三步:移动两个指针,怎样移动呢? 当前固定位置的值+第一个指针指向的值+第二个指针指向的值 如果大于目标值,由于事先我们排序了,现在超出人家的目标值了,说明我们加的数太大了,我们让后面的指针向前移动一步。。如果当前固定位置的值+第一个指针指向的值+第二个指针指向的值 小于目标值,说明我们的值还没有到达目标值,怎样做呢? 肯定是将第一个指针往后移动(这样可以让总体的值大)。。
第四步: 计算当前和减去减去目标值有没有减小,如果有减小,将其保存在result
第五步:以此类推,固定第二个值,在进行二,三,四步。。最后的result中保存的就是我们的最优值。。
Python代码实现:
import math
def find_close_target(s, target):
length = len(s)
# 初始化 随便给个值都可以
result = s[0] + s[1] + s[length-1]
sum = 0
for i in range(0, length-2):
start = i+1
end = length-1
while start < end:
sum = s[i] + s[start] + s[end]
if sum > target:
end -= 1
else:
start += 1
if math.fabs(sum-target) < math.fabs(result-target):
result = sum
return result
if __name__ == '__main__':
s = [-1, 2, 1, -4]
target = 0
# 首先对s进行排序
s = sorted(s)
# 从s中找三个数,使其最接近1
result = find_close_target(s, target)
print('最接近target的值为:', result)
输出结果: