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

提示:

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

1. 思路

这道题与三数之和问题类似,只是要求返回与目标值最接近的三个数的和。可以使用双指针法来解决这个问题。首先对数组进行排序,然后固定一个数,再使用双指针来搜索其余两个数,计算它们的和与目标值的差的绝对值,不断更新最小的差值。最后返回最接近的三个数的和。

2. 解题方法

  1. 对数组进行排序,时间复杂度为 O(nlogn)。
  2. 初始化一个变量 closestSum 用于记录最接近目标值的三个数的和。初始值设为数组的前三个数的和。
  3. 遍历数组,对每一个数固定为 nums[i]
    • 初始化双指针 left = i + 1right = n - 1,分别指向数组的左右两端。
    • left < right 的条件下,计算当前三个数的和 sum = nums[i] + nums[left] + nums[right]
    • 如果 sumtarget 的差的绝对值小于 closestSumtarget 差的绝对值,则更新 closestSumsum
    • 如果 sum 大于 target,则将 right 左移一位;如果 sum 小于 target,则将 left 右移一位;如果 sum 等于 target,则直接返回 sum
  4. 返回 closestSum

3. 复杂度

  • 时间复杂度:排序数组的时间复杂度为 O(nlogn),固定一个数后使用双指针遍历数组的时间复杂度为 O(n^2),总体时间复杂度为 O(n^2 + nlogn) = O(n^2)。
  • 空间复杂度:O(1)。

4. Code

java 复制代码
import java.util.Arrays;

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums); // 对数组进行排序
        int closestSum = nums[0] + nums[1] + nums[2]; // 初始化最接近目标值的三个数的和为数组的前三个数的和
        
        for (int i = 0; i < nums.length; i++) {
            int left = i + 1;
            int right = nums.length - 1;
            
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right]; // 计算当前三个数的和
                if (Math.abs(sum - target) < Math.abs(closestSum - target)) { // 更新最接近目标值的三个数的和
                    closestSum = sum;
                }
                
                if (sum > target) {
                    right--; // 如果当前和大于目标值,将右指针左移
                } else if (sum < target) {
                    left++; // 如果当前和小于目标值,将左指针右移
                } else {
                    return sum; // 如果当前和等于目标值,直接返回
                }
            }
        }
        
        return closestSum;
    }
}

欢迎大家后台联系讨论。

(一份比较早的面试宝典,有兴趣的读者姥爷可以私信我领取!!!免费滴)

相关推荐
吾日三省吾码3 小时前
JVM 性能调优
java
LNTON羚通4 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
弗拉唐4 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi775 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3435 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀5 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
哭泣的眼泪4085 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜5 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
蓝黑20206 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea