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).
本题与之前不同,要求找的不是刚好相加等于target的三个数,而是最接近target的三个数。首先尝试暴力破解法:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
length = len(nums)
sum = nums[0] + nums[1] + nums[2]
diff = abs(sum - target)
for i in range(0, length-2):
for j in range(i+1, length-1):
for k in range(j+1, length):
temp_sum = nums[i] + nums[j] + nums[k]
temp_diff = abs(temp_sum - target)
if temp_diff < diff:
diff = temp_diff
sum = temp_sum
return sum
果然不行,运行超时,O(n3)的复杂度无法通过。
于是尝试O(n2)复杂度的解法:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
length = len(nums)
sum = nums[0] + nums[1] + nums[2]
diff = abs(sum - target)
for i in range(length-2):
j = i + 1
k = length - 1
i_sum = nums[i] + nums[j] + nums[k]
i_diff = abs(i_sum - target)
temp_sum = i_sum
temp_diff = i_diff
while j < k:
if j == k - 1:
break
if temp_sum < target:
j += 1
elif temp_sum > target:
k -= 1
else:
return target
temp_sum = nums[i] + nums[j] + nums[k]
temp_diff = abs(temp_sum - target)
if temp_diff < i_diff:
i_sum = temp_sum
i_diff = temp_diff
""" else:
break """
if i_diff < diff:
diff = i_diff
sum = i_sum
return sum
搞定。