题目描述:
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解
输入输出实例:
思路:如果直接使用三层循环遍历的话,多半是要超时的,所以还是选择使用双指针来做减少时间复杂度。
我们先对数组进行排序,然后定义一个超级大的数后面用于和我们的三数和比较,遍历数组,nums[i]作为第一个元素,nums[left],nums[right]作为第二三个元素,如果三数和减去target直接等于0了那我们直接返回target就可以了,让存储三数和的变量不断趋近于target(不要忘记使用绝对值)
最后我们把最接近target的用于存储三数和的变量返回。最后由于我们的数组是排序过的,如果当前三数和比target大我们最右边的指针往左移,同理移动左指针。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
#采用双指针
nums.sort()
min_count = 99999
ans_count = 0
for i in range(0,len(nums)-2):
left,right = i+1,len(nums)-1
while left < right :
if nums[i]+nums[left]+nums[right]-target==0 :
return target
if abs(nums[i]+nums[left]+nums[right]-target) < min_count:
min_count = abs(nums[i]+nums[left]+nums[right]-target)
ans_count = nums[i]+nums[left]+nums[right]
if nums[i]+nums[left]+nums[right] > target :
right -= 1
elif nums[i]+nums[left]+nums[right] < target :
left += 1
return ans_count
对于这段代码还有优化的地方,这样提交上去时间太久了,所以做了一些更改,更改后的代码如下:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
#采用双指针
nums.sort()
min_count = 99999
for i in range(0,len(nums)-2):
left,right = i+1,len(nums)-1
while left < right :
current_count = nums[i]+nums[left]+nums[right]
if abs(current_count-target) < abs(min_count-target) :
min_count = current_count
if current_count > target :
right -= 1
elif current_count < target :
left += 1
else :
return current_count
return min_count