列表

详情


NC247. 最接近的三数之和

描述

给定一个数组 nums 和一个目标值 target ,请问从 nums 中选出三个数,使其之和尽量接近目标数,即三数之和与目标数只差绝对值尽可能小。

返回满足题面要求的三数之和。

数据范围:数组长度满足 ,数组中的值满足 ,目标值满足 ,可以保证只有一个结果。

示例1

输入:

[-1,2,1,-4],1

输出:

2

说明:

最接近 1 的三数之和是 -1+2+1 = 2

示例2

输入:

[0,0,0],1

输出:

0

说明:

 只有一种选择 0+0+0

示例3

输入:

[0,1,0,0],0

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-07-31

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int ClosestSum(vector<int>& v, int t) {
        // write code here
        int n = v.size();
        sort(v.begin(),v.end());
        int res = v[0]+v[1]+v[2];
        for(int i=0;i<n;i++)
        {
            int l=i+1,r=n-1;
            while(l<r)
            {
                int sum = v[i]+v[l]+v[r];
                if(abs(sum-t) <abs(res-t))
                    res = sum;
                if(sum > t)
                   r--;
                else if(sum <t)
                   l++;
                else if(sum ==t)
                   return sum;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-07-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int ClosestSum(vector<int>& nums, int target) {
        // write code here
        int i, j, k, sum, min, arr = 1e4, n = nums.size();
        sort(nums.begin(), nums.end());
        for(k = 0; k < n; k++){
            sum = target - nums[k];
            i = k+1;
            j = n-1;
            while(i < j){
                if(arr > abs(sum-nums[i]-nums[j])){
                    arr = abs(sum-nums[i]-nums[j]);
                    min = nums[i] + nums[j] + nums[k];
                }
                if(nums[i] + nums[j] == sum) break;
                else if(nums[i]+nums[j] < sum) i++;
                else if(nums[i]+nums[j] > sum) j--;
            }
            if(arr == 0) break;
        }
        return min;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int ClosestSum(vector<int>& nums, int target) {
        // write code here
        int n =nums.size();
        sort(nums.begin(),nums.end());
        int best =  1e7;
        for(int first = 0 ; first < n-2; first++){
            if(first > 0 && nums[first] == nums[first-1]){
                continue;
            }
            int second = first + 1,third = n - 1;
            while(second < third){
                int sum = nums[first] + nums[second] + nums[third];
                if(sum == target){
                    return target;
                }
                best = abs(target - sum) > abs(target - best) ? best : sum;
                if(sum > target){
                    int tmp = third - 1; 
                    while(second < tmp && nums[tmp] == nums[third]){
                        --third;
                    }
                    third = tmp;
                }else if(sum < target){
                    int tmp = second + 1;
                    while(tmp < third && nums[tmp] == nums[second]){
                        ++tmp;
                    }
                    second = tmp;
                }
            }
        }
        return best;
    }
};

C 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-02-11

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @param target int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int cmp(const void *a, const void *b){
    return *(int *)a-*(int*)b;
}
int ClosestSum(int* nums, int numsLen, int target ) {
    // write code here
    qsort(nums, numsLen, sizeof(int),cmp);
    int res=nums[0]+nums[1]+nums[2];
    int sum=0,min=10001;
    int k;
    for(k=0;k<numsLen;k++){
        int start=k+1,end=numsLen-1;
        while(start<end){
            sum=nums[start]+nums[end]+nums[k];
            if(abs(target-sum)<min){
                min=abs(target-sum);
                res=sum;
            }
             if(sum>target)
                end--;
            else if(sum<target)
                start++;
            else
                return res;
        }
    }
    return res;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    
    int ClosestSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int mem_diff=0x7fffffff;
        int mem_sum = 0x7fffffff;

        for(int k=0;k<nums.size();k++)
        {
            int i=k+1;
            int j=nums.size()-1;
            int target2=  target - nums[k];
            while(i<j)
            {
                int sum = nums[i]+nums[j];
                int diff = target2-sum;
                if(target2<sum)
                {
                    diff = -diff;
                    j--;
                }
                else
                    i++;
                if(diff<mem_diff)
                {
                    mem_diff=  diff;
                    mem_sum = sum+nums[k];
                }
            }
        }
        return mem_sum;
    }
};

上一题