[Leetcode16]最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

这题参考了15题三数之和的解法,依次遍历固定第一个数,用两个指针去寻找另外两个数,不过这题比上一题要简单点。算法在暴力的基础上有所改进,因为寻找过程中停止条件设置为两个指针相遇,实际上还可以进一步优化。

python:

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

C++: 

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        if(n < 3) return 0;
        if(n == 3) return (nums[0]+nums[1]+nums[2]);
        int minSum = nums[0]+nums[1]+nums[2];
        int delta = (nums[0]+nums[1]+nums[2]-target)>0?(nums[0]+nums[1]+nums[2]-target):(target-nums[0]-nums[1]-nums[2]);
        for(int k = 0;k < n-2;k++){
            int i = k + 1;
            int j = n - 1;
            while(i < j){
                if(nums[k]+nums[i]+nums[j]-target == 0) return target;
                else if(nums[k]+nums[i]+nums[j] < target){
                    int temp = (nums[k]+nums[i]+nums[j]-target)>0?(nums[k]+nums[i]+nums[j]-target):(target-nums[k]-nums[i]-nums[j]);
                    if(temp<delta){
                        delta = temp;
                        minSum = nums[k]+nums[i]+nums[j];
                    }
                    i += 1;
                }
                else if(nums[k]+nums[i]+nums[j] > target){
                    int temp = (nums[k]+nums[i]+nums[j]-target)>0?(nums[k]+nums[i]+nums[j]-target):(target-nums[k]-nums[i]-nums[j]);
                    if(temp<delta){
                        delta = temp;
                        minSum = nums[k]+nums[i]+nums[j];
                    }
                    j -= 1;
                }
            }
        }
        return minSum;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40501689/article/details/82913142