【算法】16. 最接近的三数之和(多语言实现)

简介: 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。

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

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

原题传送门:

https://leetcode.cn/problems/3sum-closest/


分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 这道题和【15. 三数之和】很像,但是不再是找一个值,而是要把可能的值都找一遍,最后确定最接近的值,所以不再是直接跳过大于目标,或者小于目标的值。
  • 由于有三个变量,直观的做法还是暴力三层循环,但还是传说会超时。
  • 同样我们先排个序,可以外层循环遍历作为第一个数。
  • 这里用到双指针的思想,如果是找最接近的两数之和,我们可以将两个指针先定位在有序数组的两端,去判断两数之和是否和目标相等,如果相等就是想要的结果;如果大于目标,我们向左移动右面的指针;如果小于目标,我们就向右移动左边的指针。(如果右面的指针一直向左移动就会让两数之和最小,反之如果让左面的指针一直向右移动就会使两数之和最大,这样两个指针的移动方向虽然固定了,但是却不会漏掉某种组合)
  • 扩展到三数之和,由于外层循环已经确定了第一个数的值,内层其实就是最接近的两数之和。

题解

rust

impl Solution {
   
    pub fn three_sum_closest(mut nums: Vec<i32>, target: i32) -> i32 {
   
        let n = nums.len();
        nums.sort();
        let mut ans = 23001;
        for f in 0..n {
   
            if f == 0 || nums[f] != nums[f - 1] {
   
                let mut s = f + 1;
                let mut t = n - 1;
                while s < t {
   
                    let sum = nums[f] + nums[s] + nums[t];
                    if sum == target {
   
                        return target;
                    }
                    if (sum - target).abs() < (ans - target).abs() {
   
                        ans = sum;
                    }
                    if sum > target {
   
                        let mut t0 = t - 1;
                        while s < t0 && nums[t0] == nums[t] {
   
                            t0 -= 1;
                        }
                        t = t0;
                    } else {
   
                        let mut s0 = s + 1;
                        while s0 < t && nums[s0] == nums[s] {
   
                            s0 += 1;
                        }
                        s = s0;
                    }
                }
            }
        }
        return ans;
    }
}

go

func threeSumClosest(nums []int, target int) int {
   
    n := len(nums)
    sort.Ints(nums)
    ans := 23001

    abs := func(num int) int {
   
        if num < 0 {
   
            return -num
        }
        return num
    }

    for f := 0; f < n; f++ {
   
        if f > 0 && nums[f] == nums[f-1] {
   
            continue
        }
        s, t := f+1, n-1
        for s < t {
   
            sum := nums[f] + nums[s] + nums[t]
            if sum == target {
   
                return target
            }
            if abs(sum-target) < abs(ans-target) {
   
                ans = sum
            }
            if sum > target {
   
                t0 := t - 1
                for s < t0 && nums[t0] == nums[t] {
   
                    t0 -= 1
                }
                t = t0
            } else {
   
                s0 := s + 1
                for s0 < t && nums[s0] == nums[s] {
   
                    s0 += 1
                }
                s = s0
            }
        }
    }

    return ans
}

c++

class Solution {
   
public:
    int threeSumClosest(vector<int>& nums, int target) {
   
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int ans = 23001;
        for (int f = 0; f < n; ++f) {
   
            if (f > 0 && nums[f] == nums[f - 1]) {
   
                continue;
            }
            int s = f + 1;
            int t = n - 1;
            while (s < t) {
   
                int sum = nums[f] + nums[s] + nums[t];
                if (sum == target) {
   
                    return target;
                }
                if (abs(sum - target) < abs(ans - target)) {
   
                    ans = sum;
                }
                if (sum > target) {
   
                    int t0 = t - 1;
                    while (s < t0 && nums[t0] == nums[t]) {
   
                        t0 -= 1;
                    }
                    t = t0;
                } else {
   
                    int s0 = s + 1;
                    while (s0 < t && nums[s0] == nums[s]) {
   
                        s0 += 1;
                    }
                    s = s0;
                }
            }
        }
        return ans;
    }
};

java

class Solution {
   
    public int threeSumClosest(int[] nums, int target) {
   
        int n = nums.length;
        Arrays.sort(nums);
        int ans = 23001;
        for (int f = 0; f < n; ++f) {
   
            if (f > 0 && nums[f] == nums[f - 1]) {
   
                continue;
            }
            int s = f + 1;
            int t = n - 1;
            while (s < t) {
   
                int sum = nums[f] + nums[s] + nums[t];
                if (sum == target) {
   
                    return target;
                }
                if (Math.abs(sum - target) < Math.abs(ans - target)) {
   
                    ans = sum;
                }
                if (sum > target) {
   
                    int t0 = t - 1;
                    while (s < t0 && nums[t0] == nums[t]) {
   
                        t0 -= 1;
                    }
                    t = t0;
                } else {
   
                    int s0 = s + 1;
                    while (s0 < t && nums[s0] == nums[s]) {
   
                        s0 += 1;
                    }
                    s = s0;
                }
            }
        }
        return ans;
    }
}

typescript

function threeSumClosest(nums: number[], target: number): number {
   
    const n = nums.length;
    nums.sort((a, b) => a - b);
    let ans = 23001;
    for (let f = 0; f < nums.length; ++f) {
   
        if (f > 0 && nums[f] === nums[f - 1]) {
   
            continue;
        }
        let s = f + 1;
        let t = n - 1;
        while (s < t) {
   
            const sum = nums[f] + nums[s] + nums[t];
            if (sum === target) {
   
                return target;
            }
            if (Math.abs(sum - target) < Math.abs(ans - target)) {
   
                ans = sum;
            }
            if (sum > target) {
   
                let t0 = t - 1;
                while (s < t0 && nums[t0] === nums[t]) {
   
                    t0 -= 1;
                }
                t = t0;
            } else {
   
                let s0 = s + 1;
                while (s0 < t && nums[s0] === nums[s]) {
   
                    s0 += 1;
                }
                s = s0;
            }
        }
    }
    return ans;
};

python

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        nums.sort()
        ans = 23001
        for f in range(n):
            if f > 0 and nums[f] == nums[f - 1]:
                continue
            s = f + 1
            t = n - 1
            while s < t:
                sum = nums[f] + nums[s] + nums[t]
                if sum == target:
                    return target
                if abs(sum - target) < abs(ans - target):
                    ans = sum
                if sum > target:
                    t0 = t - 1
                    while s < t0 and nums[t0] == nums[t]:
                        t0 -= 1
                    t = t0
                else:
                    s0 = s + 1
                    while s0 < t and nums[s0] == nums[s]:
                        s0 += 1
                    s = s0
        return ans

非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~


相关文章
|
10月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
417 8
|
10月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
473 8
|
10月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
800 0
|
10月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
447 0
|
10月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
370 0
|
10月前
|
存储 监控 并行计算
目标跟踪中常用点迹航迹数据关联算法的MATLAB实现
通过计算测量点与预测点之间的欧氏距离,选择最近邻点进行关联,适用于单目标跟踪场景。
|
10月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
501 2
|
10月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
10月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
11月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
407 3

热门文章

最新文章