1. 程式人生 > 實用技巧 >雙指標——最接近的三數之和,細節處理還是很關鍵的

雙指標——最接近的三數之和,細節處理還是很關鍵的

59. 最接近的三數之和

中文 English

給一個包含 n 個整數的陣列 S, 找到和與給定整數 target 最接近的三元組,返回這三個數的和。

樣例

例1:

輸入:[2,7,11,15],3
輸出:20
解釋:
2+7+11=20

例2:

輸入:[-1,2,1,-4],1
輸出:2
解釋:
-1+2+1=2

挑戰

O(n^2) 時間, O(1) 額外空間。

注意事項

只需要返回三元組之和,無需返回三元組本身

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
        numbers.sort()

        s = diff = float('inf')

        def find_nearest(arr, k, t, n):
            nonlocal s,diff
            l, r = k, len(arr) - 1
            while l < r:
                if arr[l] + arr[r] > t:
                    if arr[l] + arr[r] - t < diff:
                        s = arr[l] + arr[r] + n
                        diff = arr[l] + arr[r] - t
                    r -= 1
                else:
                    if t - arr[l] - arr[r] < diff:
                        s = arr[l] + arr[r] + n
                        diff = t - arr[l] - arr[r]
                    l += 1
            return s

        for i, n in enumerate(numbers):
            if i > 0 and numbers[i] == numbers[i - 1]:
                continue
            find_nearest(numbers, i + 1, target - n, n)

        return s