[Lintcode] 59. 3Sum Closest

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)
  • 出错:边界问题
posted @ 2019-02-04 00:32  siriusli  阅读(95)  评论(0编辑  收藏  举报