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

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;
    }
}

 欢迎大家后台联系讨论。

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

图片

相关推荐

  1. leetcode记录38-16. 接近之和

    2024-03-18 13:38:01       8 阅读
  2. LeetCode 16.接近之和

    2024-03-18 13:38:01       14 阅读
  3. LeetCode记录】15. 之和

    2024-03-18 13:38:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 13:38:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 13:38:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 13:38:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 13:38:01       20 阅读

热门阅读

  1. 前端 - 让多个块级元素div在同一行显示的3种方式

    2024-03-18 13:38:01       22 阅读
  2. 前端 - 管理后台自定义侧边导航栏

    2024-03-18 13:38:01       23 阅读
  3. web开发模式

    2024-03-18 13:38:01       24 阅读
  4. 前端系统设计个人总结

    2024-03-18 13:38:01       20 阅读
  5. API安全集成最佳实践:有效应对安全挑战

    2024-03-18 13:38:01       21 阅读
  6. 【 React 】React 中的setState执行机制

    2024-03-18 13:38:01       24 阅读
  7. 利用自带文字提取工具,使工作提效

    2024-03-18 13:38:01       19 阅读