59. 3Sum Closest
Description
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers.
Example
For example, given array S = [-1 2 1 -4], and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Challenge
O(n^2) time, O(1) extra space
Notice
You may assume that each input would have exactly one solution.
我的代码
class Solution:
"""
@param numbers: Give an array numbers of n integer
@param target: An integer
@return: return the sum of the three integers, the sum closest target.
"""
def threeSumClosest(self, numbers, target):
# write your code here
res = numbers[0]+numbers[1]+numbers[2]
numbers.sort()
l = len(numbers)
for i in range(1,l-1):
left = i-1
right = i+1
while left>=0 and right<=l-1:
if abs(numbers[i]+numbers[left]+numbers[right]-target)<abs(res-target):
res = numbers[i]+numbers[left]+numbers[right]
if numbers[i]+numbers[left]+numbers[right]>target:
left -= 1
else:
if numbers[i]+numbers[left]+numbers[right]<target:
right += 1
else:
break
if res == target:
break
return res
思路:
这里的思路是,除了第一个和最后一个元素,其他每个元素都有可能作为数组中间值。另外两个一个在左一个在右。如果结果偏大,则左边结果偏大了应该缩小,反之右边结果偏小,应该放大。
也可以选择固定左边元素,另外两个元素的初始位置在紧挨着固定元素和数组末尾,这种思路参照[leetcode]15. 3Sum 的解法。
- 时间复杂度: O(n*n)
- 出错:边界问题