leetcode 16.最接近的三数之和

给你一个长度为 n 的整数数组 nums和 一个目标值 target。请你从 nums中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

复制代码
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

复制代码
输入:nums = [0,0,0], target = 1
输出:0
cpp 复制代码
/*
    给一个长度为 n 的整数数组 nums 和 一个目标值 target
    输入: nums = [-1,2,1,-4] target = -1
    输出: 2 
    解析: 与 target 最接近的和是 2(-1 + 2 + 1 = 2)
*/
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end()); // O(nlogn)
        int ans = nums[0] + nums[1] + nums[2];
        for(int i=0;i<nums.size();++i) {
            int start = i + 1,end = nums.size() - 1;
            while(start < end) {
                int sum = nums[i] + nums[start] + nums[end];
                if(abs(target - sum) < abs(target - ans)) ans = sum;
                if(sum > target) end--;
                else if(sum < target) start++;
                else return ans;
            }
        }
        return ans;
    }
};
cpp 复制代码
// -1 2 1 -4  target = 1
/*
   -4 -1  1  2  
    |  |  |
    i  s  e 
*/
// 初始化
// ans : -4 + (-1) + 1 = -4

/*
   -4 -1  1  2  
    |  |     |
    i  s     e 
*/
// sum = nums[i] + nums[s] + nums[e] = -3
// abs(target-sum) 和 abs(target-ans)
/*
   abs(target-sum) = abs(1-(-4)) = 5
   abs(target-ans) = abs(1-(-3)) = 4 
   abs(target-sum) < abs(target-ans) 
*/
// ans = sum = -3

// 因为 sum(-3) < target(1),所以s右移,有可能效果更好

/*
   -4 -1  1  2  
    |     |  |
    i     s  e 
*/
// sum = -4 + 1 + 2 = -1
// abs(target-sum) 和 abs(target-ans)
/*
   abs(target-sum) = abs(1-(-1)) = 2
   abs(target-ans) = abs(1-(-3)) = 4 
   abs(target-sum) < abs(target-ans) 
*/
// ans = sum = -1

// 因为 sum(-1) < target(1),所以s右移,有可能效果更好
/*
   -4 -1  1  2  
    |        ||
    i        es 
*/
// 此时e和s重合,i右移
/*
   -4 -1  1  2  
       |  |  |
       i  s  e 
*/
// sum = -1 + 1 + 2 = 2
// abs(target-sum) 和 abs(target-ans)
/*
   abs(target-sum) = abs(1-(2)) = 1
   abs(target-ans) = abs(1-(-1)) = 2 
   abs(target-sum) < abs(target-ans) 
*/
// ans = sum = 2
// 因为 sum(2) < target(1),所以e左移,有可能效果更好

// 此时e和s重合,i右移
/*
   -4 -1  1  2  
          |  ||  
          i  se
*/
// e和s重合,不足3个数,结束
相关推荐
漂流瓶jz31 分钟前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·1 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
是main不是漫2 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司3 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真5 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄5 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy5 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH6 小时前
P5025 [SNOI2017] 炸弹
c++·算法
A boy CDEF girl6 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
没落之王6 小时前
三易五行看宋朝的三界确立
大数据·人工智能·算法