题目:3Sum Closest
Given an array nums
of n integers and an integer target
, find three integers in nums
such that the sum is closest to target
. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
解题思路:在一个数组中找出3个数的和,要求与目标数最接近。一开始想到最直接的方法是三个循环,每次更新离目标数最近的数,但是这样时间复杂度太高了,于是想到两点降低复杂度:
1、从两头往中间扫描而不是都从一个方向朝另一个方向。
2、选择一个数字从左到右,并且在之后的查询不再考虑这个数字。
以上两点可以通过固定一个数,其余两个数通过左右开始查询,结果大于目标,则移动一边,否则移动另一边。这要求我们在开始时将数组排好序。
第一个数字之所以每次循环可以不用考虑之前的数字是因为在第一次大循环时已经把包含这个数字的所有排列组合考虑了一次,所以在之后的循环中可以不必考虑。
Code:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
sum=0
final=0
dis=2147483647
for i in range(len(nums)):
j=i+1
k=len(nums)-1
while j<k:
sum=nums[i]+nums[j]+nums[k]
temp=target-sum
if temp==0:
return sum
if dis>abs(temp):
dis=abs(temp)
final=sum
if temp>0 and j<k:
j+=1
if temp<0 and j<k:
k-=1
return final