找三个数最接近目标值

题目: 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)

输出结果: