16. 最接近的三数之和

简介: 16. 最接近的三数之和

题目:

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

返回这三个数的和。

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

跟三数之和思路差不多,使用双指针
重点是如何判断差值的距离
使用Math.abs(target-三个数的和)越小,距离就越近
先给数组排序
固定好i,
在i+1到n-1的范围找出sum
如果sum>target,那么r–,
否则l++

int threeSumClosest(int *nums, int numsSize, int target) {
    int n = numsSize;
    qsort(nums, n, sizeof(int), comp);
    int best = 1e7;

    // 根据差值的绝对值来更新答案

    // 枚举 a
    for (int i = 0; i < n; ++i) {
        // 保证和上一次枚举的元素不相等
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        // 使用双指针枚举 b 和 c
        int j = i + 1, k = n - 1;
        while (j < k) {
            int sum = nums[i] + nums[j] + nums[k];
            // 如果和为 target 直接返回答案
            if (sum == target) {
                return target;
            }
            if (abs(sum - target) < abs(best - target)) {
                best = sum;
            }
            if (sum > target) {
                // 如果和大于 target,移动 c 对应的指针
                int k0 = k - 1;
                // 移动到下一个不相等的元素
                while (j < k0 && nums[k0] == nums[k]) {
                    --k0;
                }
                k = k0;
            } else {
                // 如果和小于 target,移动 b 对应的指针
                int j0 = j + 1;
                // 移动到下一个不相等的元素
                while (j0 < k && nums[j0] == nums[j]) {
                    ++j0;
                }
                j = j0;
            }
        }
    }
    return best;
}
相关文章
|
5月前
|
缓存 安全 网络虚拟化
steam错误代码-118怎么办?101,137等问题解决
本文介绍了两种解决Steam常见问题的方法:一是使用第三方安全软件一键修复,操作简单方便;二是进行基础网络检查,如确认网络连接、重启路由器、关闭VPN等,并推荐使用“驱动人生”检测修复网卡问题。
386 4
|
数据采集 存储 数据可视化
辽宁链家新房数据采集与可视化实现
本文介绍了利用Python网络爬虫技术从链家网爬取辽宁省大连市和沈阳市的新房数据,并通过数据清洗、统计和可视化分析,揭示房源分布和价格特征,帮助用户做出更明智的购房决策。
254 0
|
机器学习/深度学习 人工智能 搜索推荐
抖音上线AI社交APP“话炉”
【2月更文挑战第16天】抖音上线AI社交APP“话炉”
606 2
抖音上线AI社交APP“话炉”
|
存储 Java 编译器
Android | 使用 AspectJ 限制按钮快速点击
Android | 使用 AspectJ 限制按钮快速点击
448 1
Android | 使用 AspectJ 限制按钮快速点击
|
存储 监控 Shell
Linux操作系统期末复习题
Linux操作系统期末复习题
612 1
|
存储 JavaScript 前端开发
JavaScript内存管理与优化:避免内存泄漏的垃圾收集机制
JavaScript作为一种动态语言,在执行过程中使用内存来存储数据和变量。然而,疏忽或错误可能导致内存泄漏,进而造成**物理内存溢出**。为了解决这个问题,JavaScript具备了垃圾收集机制,通过**管理**和**释放**不再使用的内存来避免内存泄漏。本文将深入探讨JavaScript内存管理与优化的重要性,垃圾收集机制的工作原理,以及优化内存分配的实践方法。
453 0
JavaScript内存管理与优化:避免内存泄漏的垃圾收集机制
|
存储 Python
详解Python生成二维码插件QrCode的使用
二维码(QR Code)是一种常见的矩阵型条码,被广泛用于扫码支付、产品标识、活动推广等领域。Python提供了许多第三方库用于生成和解析二维码,其中最常用的是qrcode库。本文将介绍如何使用qrc
688 0
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(上)
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)
575 0
|
数据采集 算法 API
用 Python 实现你的量化交易策略
Python 由于开发方便,工具库丰富,尤其科学计算方面的支持很强大,所以目前在量化领域的使用很广泛。市面上也出现了很多支持 Python 语言的量化平台。通过这些平台,你可以很方便地实现自己的交易策略,进行验证,甚至对接交易系统(由于政策原因,现在很多交易接口暂停开放)。
|
JSON Android开发 数据格式
android studio中出现com.google.gson.JsonSyntaxException: com.google.gson.stream.类似错误的一种解决方案
android studio中出现com.google.gson.JsonSyntaxException: com.google.gson.stream.类似错误的一种解决方案
693 0
android studio中出现com.google.gson.JsonSyntaxException: com.google.gson.stream.类似错误的一种解决方案

热门文章

最新文章