题目
个人解–超时
依稀记得昨天自己有想法,然后今天用了算是贪心算法吧。思路清晰,代码一遍过。但是用例超时了。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
Sum,ans=abs(nums[0]+nums[1]+nums[2]-target),nums[0]+nums[1]+nums[2]
for i in range(len(nums)):
j=1
while i+j<len(nums):
k=1
while i+j+k<len(nums):
temp=abs(nums[i]+nums[i+j]+nums[i+j+k]-target)
if temp<Sum:
Sum=temp
ans=nums[i]+nums[i+j]+nums[i+j+k]
k+=1
j+=1
return ans
我的个人理解是,这题跟昨天的题一个模子刻出来的,只是上一题是找确切的值,本题可能找的是一个近似值。
官方解
学到了,先排序然后两头夹,这样就减少了很多枚举的次数。
画解算法
看了解析感觉我的总体思路是有的,但是细节处理还是不够,算法还能够优化,学海无涯、
改进解
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
Sum,ans=abs(nums[0]+nums[1]+nums[2]-target),nums[0]+nums[1]+nums[2]
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i - 1]:
continue
j,k=i+1,len(nums)-1
while j<k:
temp=nums[i]+nums[j]+nums[k]
if temp==target:
return temp
elif temp>target:
if abs(temp - target)<Sum:
Sum=abs(temp - target)
ans=nums[i]+nums[j]+nums[k]
k-=1
else:
if abs(temp - target)<Sum:
Sum=abs(temp - target)
ans=nums[i]+nums[j]+nums[k]
j+=1
return ans