'''
思路:此题的思路和三数之和相同
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)
来源:oschina
链接:https://my.oschina.net/tedzheng/blog/3171668