【LeetCode04】最接近的三数之和

时间:2022-06-25
本文章向大家介绍【LeetCode04】最接近的三数之和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

示例1:

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

先思考一下,后面我会给出一个解题思路~?

图来自网络

这道题目,用到了一种算法——双指针算法。如果先前没有见过,你可以简单理解,双指针算法就是利用两个指针,一个在数组开头,一个在结尾,前者从前往后移动,后者从后往前移动,直到找到符合我们要求的位置。

对于我们这道题,可以按照下面的思路去解答:

1 数组排序。使用双指针算法前都是需要有序数组的,所以先排序;

如,对于示例 nums = [-1,2,1,-4] ,排序后就是[-4, -1, 1, 2]

2 )对数组nums进行遍历,在当前位置后的空间,再对其进行双指针遍历;

如:对于示例 nums = [-4, -1, 1, 2],

当i=1时候,就在nums[2:] 后的空间,即在 [1,2] 中进行双指针遍历:

左指针从最左端开始,即 left = i+1

右指针从最右端开始,即 right = len(nums)-1

3 )如果三数之和( nums[i]+nums[left]+nums[right] )就是target,马上返回结果;

  • 如果三数之和 小于target,因为数组是排好序的,所以左指针向右移动1个位置,增大三数之和;
  • 如果三数之和 大于target,右指针向左移动1个位置,减小三数之和;
  • 一直迭代,直到left>right

4 )不断迭代2-3步,不断缩小三数之和与目标target的差值。

Python实现:

def threeSumClosest(nums, target):
    # 先对数组进行排序
    nums.sort()
    print(nums)
    # 获取数组长度
    length=len(nums)
    # 如果数组长度小于3,返回None
    if length<3:return None
    # res记录当前求和结果
    res=nums[0]+nums[1]+nums[2]
    # 迭代数组
    for i in range(length):
        left,right=i+1,length-1
        while left<right:
            tmpsum=nums[i]+nums[left]+nums[right]
            if tmpsum>target:
                right-=1
            elif tmpsum<target:
                left+=1
            else:return tmpsum

            if abs(tmpsum-target)<abs(res-target):
                res=tmpsum
    return res

? 配图角色背景介绍:

钢铁侠、绿巨人、雷神联合打造出来的人造人,可随机改变外貌,额头镶着心灵宝石,是他的生命之源。 复联中幻视的登场戏份不多,使得大家并不是很留意过他,但是他的身上拥有者无限宝石的其中一颗心灵宝石。无限宝石有多强大这个就不细说了,奇异博士仅用了时间宝石的一部分能力就能逼迫多玛姆停止入侵地球的脚步。幻视的能力还未展现出来,但是即将上映的《复仇者联盟3》灭霸的到来就是冲着幻视身上这颗心灵宝石而来。 幻视(Vision)是美国漫威漫画旗下超级英雄,初次登场于《Avengers》第57期 (1968年10月),是奥创为了对付复仇者联盟,将二战英雄初代霹雳火的身体改造,并用神力人的脑波将之激活而成的生化人,之后在与复仇者的多次战斗中、幻视被复仇者成员之间的人性所感动、从而背叛奥创加入复仇者联盟,并且遇到了同为复仇者成员的绯红女巫、于是两人坠入爱河结为夫妻。 在电影《复仇者联盟2:奥创纪元》中改编为是钢铁侠设计的人工智能管家“贾维斯”的升级版本(注:成为幻视后意识已经不是贾维斯,而自我产生了一个新的思维和意识),身体是奥创用“再生摇篮”制造,并使用振金为材料,生命来源源自于洛基权杖上的心灵宝石,在布鲁斯·班纳(绿巨人)和托尼·史塔克(钢铁侠)上传贾维斯的意识后、由雷神托尔的雷神之锤放电激活完成。因为心灵宝石的原因,所以能够举起雷神之锤,后加入复仇者联盟。