LeetCode.16.最接近的三数之和

岁酱吖の 提交于 2020-02-27 06:21:17
'''
思路:此题的思路和三数之和相同
     1.将数组从小到大排序,并定义3个指针:index,left,right;
          >>left=index+1,right=length(数组)
     2.循环当前指针index,并将left,right相向移动;
     3.如果当前值cur_Sum:[sum(index+left+right)]=target是最小值;记录结果
     4.如果当前值cur_Sum比前一结果res更优,替换结果res=cur_Sum
     5.如果cur_Sum>target;right太大,right向左移
     6.如果cur_Sum<target;left太小,left向右移
     特判:
         数组长度<=3,返回值
         sum(index+left+right)=target,返回值
     去重:
         num(i)==num(i-1)
注意:python的正负无穷大=float("inf"),float("-inf")
'''
def threeSumClosest(nums,target):
    if len(nums)<=3:                 #列表长度<=3
        return sum(nums)            #返回列表求和值
    nums.sort()                      #列表从小到大排序
    res=float("inf")                 #初始差异值=无空大
    cur_Sum=0                      #当前求和值
    res_list=[]
    for i in range(0,len(nums) ):    #循环列表
        #当前值=上一值,跳转到下一i
        if i>0 and nums[i]==nums[i-1]:      #i>0控制避免i-1指向列表尾
            continue
        left=i+1                       #左指针 
        right=len(nums)-1              #右指针
        while left<right:
            cur_Sum=nums[i]+nums[left]+nums[right]          #当前三数求和
            if cur_Sum==target:                             #符合条件
                #debug:记录指标,判断是否有重复记录
                res_list=[nums[i],nums[left],nums[right]]
                return cur_Sum,res_list
            if abs(cur_Sum-target)<abs(res-target):        #获取当前最小值
                res=cur_Sum
                #debug:记录指标,判断是否有重复记录
                res_list=[nums[i],nums[left],nums[right]]
            elif cur_Sum>target:                      #求和值>当前结果,right左移
                right=right-1
            elif cur_Sum<target:                      #求和值<当前结果,left左移
                left=left+1
            else:
                return res,res_list
    
    return res,res_list
    
nums=[[0,0,0],[-1,2,1,-4],[0,2,1,-3]]
ans=threeSumClosest(nums[2],1)
print(ans)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!