LeetCode【0016】最接近的三数之和

本文目录

  • 1 中文题目
  • 2 求解方法1:二分查找法
    • 2.1 思路说明
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 求解方法2:排序 + 双指针法
    • 3.1 思路说明
    • 3.2 Python代码
    • 3.3 复杂度分析
  • 4 题目总结

1 中文题目

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

示例 :

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

提示:

  • 3 ≤ n u m s . l e n g t h ≤ 1000 3 \leq nums.length \leq 1000 3nums.length1000
  • − 1000 ≤ n u m s [ i ] ≤ 1000 -1000 \leq nums[i] \leq 1000 1000nums[i]1000
  • − 1 0 4 ≤ t a r g e t ≤ 1 0 4 -10^4 \leq target \leq 10^4 104target104

2 求解方法1:二分查找法

2.1 思路说明

排序保证有序性,固定两个数,用二分查找找第三个数,维护一个全局最小差值,记录最接近的和。

具体思路

  • 预处理阶段:
    • 对数组进行排序,保证有序性
    • 初始化最接近和为前三个数的和
  • 外层固定处理:
    • 第一层循环固定第一个数nums[i]
    • 第二层循环固定第二个数nums[j]
    • 计算当前已固定两数之和sum_two = nums[i] + nums[j]
    • 计算需要寻找的目标值need = target - sum_two
  • 二分查找阶段:
    • 在区间[j+1, n-1]内寻找第三个数
    • 比较中间位置的值nums[mid]与need的关系
    • 根据nums[mid]与need的大小关系调整区间
    • 每次更新时计算当前三数之和与target的差值
  • 更新策略:
    • 维护全局最小差值min_diff
    • 维护最接近的和closest_sum
    • 当找到完全相等的和时直接返回
    • 当找到更小的差值时更新结果

2.2 Python代码

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:"""使用二分查找求解最接近的三数之和:param nums: 输入数组:param target: 目标值:return: 最接近目标值的三数之和"""# 数组排序nums.sort()n = len(nums)# 初始化最接近的和closest_sum = nums[0] + nums[1] + nums[2]# 特判:如果target小于最小三数和或大于最大三数和min_sum = nums[0] + nums[1] + nums[2]max_sum = nums[-1] + nums[-2] + nums[-3]if target <= min_sum:return min_sumif target >= max_sum:return max_sum# 固定第一个数for i in range(n-2):# 去重if i > 0 and nums[i] == nums[i-1]:continue# 固定第二个数for j in range(i+1, n-1):# 去重if j > i+1 and nums[j] == nums[j-1]:continue# 二分查找第三个数# 计算需要找的目标值need = target - nums[i] - nums[j]# 在[j+1, n-1]范围内二分查找left = j + 1right = n - 1# 如果范围内只有一个数,直接判断if left == right:curr_sum = nums[i] + nums[j] + nums[left]if abs(curr_sum - target) < abs(closest_sum - target):closest_sum = curr_sumcontinue# 二分查找过程while left < right - 1:  # 保留两个相邻的数mid = left + (right - left) // 2curr_sum = nums[i] + nums[j] + nums[mid]# 更新最接近的和if abs(curr_sum - target) < abs(closest_sum - target):closest_sum = curr_sum# 根据大小关系调整区间if curr_sum == target:return targetelif curr_sum > target:right = midelse:left = mid# 检查区间内剩余的数# 检查left位置curr_sum = nums[i] + nums[j] + nums[left]if abs(curr_sum - target) < abs(closest_sum - target):closest_sum = curr_sum# 检查right位置curr_sum = nums[i] + nums[j] + nums[right]if abs(curr_sum - target) < abs(closest_sum - target):closest_sum = curr_sumreturn closest_sum

2.3 复杂度分析

  • 时间复杂度:O(n²logn)
    • 排序:O(nlogn)
    • 第一层循环:O(n)
    • 第二层循环:O(n)
    • 内层二分查找:O(logn)
  • 空间复杂度:O(logn)或O(n)
    • 排序空间:O(logn)或O(n)
    • 其他变量:O(1)

3 求解方法2:排序 + 双指针法

3.1 思路说明

先将数组排序,以便使用双指针。固定一个数,用双指针在剩余部分寻找最接近的两个数。通过比较三数之和与目标值的差值,不断更新最接近的结果

详细算法步骤:

  • 首先对数组排序,便于使用双指针和去重
  • 固定第一个数nums[i],然后使用双指针(left, right)在剩余数组中寻找最接近的两个数
  • 在遍历过程中:
    • 计算当前三数之和sum = nums[i] + nums[left] + nums[right]
    • 比较sum与target的差值,更新最接近的结果
    • 如果sum > target,right左移
    • 如果sum < target,left右移
    • 如果sum == target,直接返回target

优化策略:

  • 去重:跳过重复的第一个数
  • 剪枝:根据排序后的特性提前结束

3.2 Python代码

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:"""最接近的三数之和:param nums: 输入数组:param target: 目标值:return: 最接近目标值的三数之和"""n = len(nums)# 先对数组排序,便于使用双指针和剪枝nums.sort()# 初始化最接近和为前三个数的和closest_sum = nums[0] + nums[1] + nums[2]# 优化1:先判断边界情况# 如果target小于数组中最小的三数之和min_sum = nums[0] + nums[1] + nums[2]if target <= min_sum:return min_sum# 如果target大于数组中最大的三数之和max_sum = nums[-1] + nums[-2] + nums[-3]if target >= max_sum:return max_sum# 固定第一个数,遍历数组for i in range(n-2):# 去重:跳过重复的第一个数if i > 0 and nums[i] == nums[i-1]:continue# 优化2:当前最小和已经大于target# 由于数组已排序,后面的和只会更大,可以提前结束curr_min = nums[i] + nums[i+1] + nums[i+2]if curr_min > target:# 更新closest_sum(如果当前的最小和更接近target)if abs(curr_min - target) < abs(closest_sum - target):closest_sum = curr_minbreak# 优化3:当前最大和小于target# 说明以当前数字为第一个数时,找不到比当前closest_sum更接近的和curr_max = nums[i] + nums[-1] + nums[-2]if curr_max < target:# 更新closest_sum(如果当前的最大和更接近target)if abs(curr_max - target) < abs(closest_sum - target):closest_sum = curr_maxcontinue# 使用双指针在剩余数组中寻找最接近的两个数left = i + 1  # 左指针right = n - 1  # 右指针while left < right:# 计算当前三数之和curr_sum = nums[i] + nums[left] + nums[right]# 如果恰好等于target,直接返回if curr_sum == target:return target# 更新最接近的和if abs(curr_sum - target) < abs(closest_sum - target):closest_sum = curr_sum# 根据curr_sum与target的关系移动指针if curr_sum > target:# 和太大,右指针左移right -= 1else:# 和太小,左指针右移left += 1return closest_sum

3.3 复杂度分析

  • 时间复杂度:O(n²)
    • 排序:O(nlogn)
    • 主循环:O(n)
    • 双指针循环:O(n)
  • 空间复杂度分析:O(logn)或O(n)
    • 排序空间:O(logn)或O(n)
    • 其他变量:O(1)

4 题目总结

题目难度:中等
数据结构:数组
应用算法:双指针、分治法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算:定义、类型及对企业的影响

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企…

如何优化Elasticsearch的查询性能?

优化Elasticsearch查询性能可以从以下几个方面进行&#xff1a; 合理设计索引和分片&#xff1a; 确保设置合理的分片和副本数&#xff0c;考虑数据量、节点数和集群大小。根据数据量和节点数量调整分片数量&#xff0c;避免使用过多分片&#xff0c;因为每个分片都需要额外的…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要&#xff0c;实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段&#xff0c;并且可以通过快速选择组件来快速选择特定的时间范围。 如图&#xff1a; 功能介绍 时间范围选择&…

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化&#xff0c;这种变化也可以理解为图像中像素的反向移动。“光流”&#xff08;Optical Flow&#xff09;是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…

SSE (Server-Sent Events) 服务器实时推送详解

Server-Sent Events 一、什么是 SSE ?二、SSE 的工作原理三、SSE 的基本配置1.HTTP 请求和响应头设置2.SSE 字段介绍3.SSE 事件数据流示例 四、SseEmitter 的基本配置1.SseEmitter 介绍及用法2.使用 SseEmitter 示例11)编写核心 SSE Client2)编写 Controller3)前端接收与处理 …

AI大模型:重塑软件开发流程的优势、挑战及应对策略

随着人工智能技术的飞速发展&#xff0c;AI大模型正在深刻影响着软件开发的各个环节。本文将详细分析AI在软件开发流程中带来的优势&#xff0c;面临的挑战&#xff0c;以及开发者的应对策略。 一、AI在软件开发流程中的优势 提高开发效率 AI大模型能够自动生成高质量的代码…

《重学Java设计模式》之 原型模式

原型模式主要解决的问题就是创建重复对象&#xff0c;而这部分对象内容本身比较复杂&#xff0c;生成过程可能从库或者RPC接口中获取数据的耗时较长&#xff0c;因此采用克隆的方式节省时间。 案例&#xff1a;上机考试抽题&#xff0c;要求打乱题目、答案数据 工厂结构 选择题…

Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…

html+js+css实现拖拽式便签留言

前些日子在网上冲浪时&#xff0c;看到一个便签式留言墙&#xff0c;让人耳目一新。心想这个看着不错&#xff0c;额想要。于是便开始搜寻是否有相应开源插件&#xff0c;想将其引入自己的博客中。但是搜寻了一圈&#xff0c;都没有符合预期的,要么功能不符合。有的功能符合&am…

模型压缩相关技术概念澄清(量化/剪枝/知识蒸馏)

1.模型压缩背景 随着深度学习技术的不断发展&#xff0c;模型的规模和复杂度也随之增加。大型模型往往具有更高的精度和更强的泛化能力&#xff0c;但在实际应用中&#xff0c;模型的大小却成为了一个制约因素。模型体积过大会导致存储、传输和推理速度等方面的瓶颈&#xff0…

Linux入门:环境变量与进程地址空间

一. 环境变量 1. 概念 1️⃣基本概念&#xff1a; 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#x…

Mysql前言

文章目录 Mysql 数据库简介SQL 基础语法什么是 SQL语句SQL 的作用SQL 语句的分类SQL 通用语法查询状态 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月12日18点20分 SQL是数据库…

VCSVerdi:KDB文件的生成和导入

相关阅读 VCShttps://blog.csdn.net/weixin_45791458/category_12828763.html Verdihttps://blog.csdn.net/weixin_45791458/category_12829428.html?spm1001.2014.3001.5482 前言 在复杂的设计中&#xff0c;很难在HDL或测试平台级别&#xff08;如使用系统函数&#xff…

2024年【汽车修理工(高级)】考试试卷及汽车修理工(高级)证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车修理工&#xff08;高级&#xff09;考试试卷是安全生产模拟考试一点通总题库中生成的一套汽车修理工&#xff08;高级&#xff09;证考试&#xff0c;安全生产模拟考试一点通上汽车修理工&#xff08;高级&#…

灵活就业,真的等同于失业吗?“三无人员”如何齐短板获贷款

现在灵活就业的人越来越多&#xff0c;目前有约2亿人选择灵活就业&#xff0c;今天咱们就来好好聊聊&#xff0c;灵活就业&#xff0c;它真的等同于失业吗&#xff1f; 咱们可以看看那些跑外卖的、做网约车司机的&#xff0c;虽然他们看起来在忙忙碌碌地工作&#xff0c;但细究…

python识别ocr 图片和pdf文件

#识别图片 pip3 install paddleocr pip3 install paddlepaddle#识别pdf pip3 install PyMuPDF 重点&#xff1a;路径不能有中文&#xff0c;不然pdf文件访问不了 from paddleocr import PaddleOCR from rest_framework.response import Response from rest_framework.views im…

由于找不到mfc120u.dll, 无法继续执行代码。重新安装程序可能解决引问题。

运行MFC程序报下面错误,无法到找运行库mfc120u.dll msvcr120.dll也找不到 下载C++运行库安装程序 mfc12对应2013运行库 运行库安装成功

介绍和安装及数据类型

1、介绍和安装 1.1、简介 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&…

【Pikachu】越权访问实战

所谓理想&#xff0c;只是同时拥有实力的人才能说的“现实”。所谓弱就是一种罪。 1.Over Permission概述 如果使用A用户的权限去操作B用户的数据&#xff0c;A的权限小于B的权限&#xff0c;如果能够成功操作&#xff0c;则称之为越权操作。 越权漏洞形成的原因是后台使用了…

KubeVirt入门介绍

KubeVirt入门介绍 KubeVirt 是一个开源项目&#xff0c;旨在通过 Kubernetes 管理虚拟机&#xff08;VM&#xff09;&#xff0c;使得 Kubernetes 不仅支持容器化工作负载&#xff0c;还支持虚拟机的部署和管理。这种双重支持的目标是提供一个统一的云原生平台&#xff0c;让开…