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

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/84565098