1. 程式人生 > >LeetCode演算法題16:最接近的三數之和解析

LeetCode演算法題16:最接近的三數之和解析

給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1.

與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).

這個題和三數之和那個題基本一樣,甚至思想更簡單了一些,只需要設定一個差值,每次三數相加時對比差值,如果更小就儲存三數之和,而且這個題不需要去掉重複項,遍歷的思路還是一樣,先排序,然後逐個遍歷,利用雙指標將之後剩餘數都遍歷一遍算加和再比價差值即可。

C++原始碼:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int res = nums[0]+nums[1]+nums[2];
        int diff = abs(res-target);
        sort(nums.begin(), nums.end());
        for (int k=0;k<nums.size()-2;k++)
        {
            int i = k+1
; int j = nums.size()-1; while (i<j) { int sum = nums[k] + nums[i] + nums[j]; if (abs(sum-target) < diff) { diff = abs(sum-target); res = sum; } if
(sum<target) i++; else j--; } } return res; } };

python3原始碼:

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        res = sum(nums[0:3])
        diff = abs(res-target)
        nums.sort()
        for k in range(len(nums)-2):
            i = k+1
            j = len(nums)-1
            while i<j:
                threeSum = nums[k] + nums[i] + nums[j]
                if abs(threeSum-target)<diff:
                    diff = abs(threeSum-target)
                    res = threeSum
                if threeSum<target:
                    i += 1
                else:
                    j -= 1
        return res