• **16. 3Sum Closest


    1. 原始题目

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

    例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
    
    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

    2. 分析

    本题是最近的三数之和,与15题三数之和很类似,不同之处有这么几点:

    1)三数之和要求和为0,本题要求三数之和与提供的一个target最近。也就是说和不一定为target,只要找出绝对值最小的即可。

    2)三数之和需要去重复,本题只要找出最小距离就行。

    3)本题如果找到和target距离为0的三个数时即可停止寻找,返回结果就行。因为三数与target最小距离也只能是0,没必要再去寻找。除非题目要求找出与target距离最近的所有的三数。

    3. 解题

     1 class Solution:
     2     def threeSumClosest(self, nums, target):
     3         if len(nums)<3: return []
     4         results = abs(nums[0]+nums[1]+nums[2]-target)       # 首先设立一个基准初始值。假定开头三个数的距离最小,记在results里,后面与他作比较
     5         sss=[nums[0],nums[1],nums[2]]                       # 记录基准初始值的三个数,之后如果有更好的结果也会更新此值       
     6         L = sorted(nums)       # 排序                              
     7         
     8         for i in range(len(L)):      
    10             head = i+1                # head指向i下一个位置
    11             tail = len(L)-1           # tail指向尾部
    12             while(head<tail):         # 若未相遇              
    13 #                print(L[i],L[head],L[tail])
    14                 if abs(L[head]+L[tail]+L[i]-target)<results:   # 如果又更小的距离
    15                     results = abs(L[head]+L[tail]+L[i]-target)    # 更新距离
    16                     sss=[L[head],L[tail],L[i]]                    # 更新三数
    17                 if L[head]+L[tail]+L[i]-target==0:                # 另外如果相距为0的话,直接返回,没必要再找了 
    18                     return sum(sss)
    19                 if L[head]+L[tail]+L[i]-target>0:                 # 如果此时他们的和大于0,我们希望它靠近于0呀,所以尾部左移,减小他们的和 
    20                     tail-=1
    21                 else:
    22                     head+=1                                       # 如果此时他们的和小于0,我们希望它靠近与0呀。所以头部右移,增大他们的和
    23             i+=1
    24         return sum(sss)
  • 相关阅读:
    自己动手制作symbian签名
    中移动陈大庆:中国移动JAVA4.1规范和SDK工具
    角色扮演游戏引擎的设计原理
    小团队开发J2ME游戏的阶段划分
    角色扮演游戏中敌人AI(人工智能)的设计方法
    入门:Android 文档的阅读顺序
    2016 MultiUniversity Training Contest 1
    真我
    DBA是我的梦想
    解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
  • 原文地址:https://www.cnblogs.com/king-lps/p/10683454.html
Copyright © 2020-2023  润新知