相向双指针-16. 最接近的三数之和

16. 最接近的三数之和

  • 题目描述
  • 思路讲解
  • 代码展示
  • 复杂度分析
  • 相关标签

题目描述

在这里插入图片描述

思路讲解

思路和 15. 三数之和 类似,排序后,枚举 nums[i] 作为第一个数,那么问题变成找到另外两个数,使得这三个数的和与 target 最接近,这同样可以用双指针解决。

设 s=nums[i]+nums[j]+nums[k],为了判断 s 是不是与 target 最近的数,我们还需要用一个变量 minDiff 维护 ∣s−target∣ 的最小值。分类讨论:

  1. 如果 s=target,那么答案就是 s,直接返回 s。
  2. 如果 s>target,那么如果s−target<minDiff,说明找到了一个与 target 更近的数,更新 minDiff 为 s−target,更新答案为s。然后和三数之和一样,把 k 减一。
  3. 否则 s<target,那么如果 target−s<minDiff,说明找到了一个与target 更近的数,更新 minDiff 为 target−s,更新答案为 s。然后和三数之和一样,把 j 加一。

除此以外,还有以下几个优化:

  1. 设 s=nums[i]+nums[i+1]+nums[i+2]。如果s>target,由于数组已经排序,后面无论怎么选,选出的三个数的和不会比 s 还小,所以不会找到比 s 更优的答案了。所以只要s>target,就可以直接 break 外层循环了。在 break 前判断 s 是否离 target 更近,如果更近,那么更新答案为s。
  2. 设 s=nums[i]+nums[n−2]+nums[n−1]。如果 s<target,由于数组已经排序,nums[i]加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了,无法找到比 s 更优的答案。但是后面还有更大的nums[i],可能找到一个离 target 更近的三数之和,所以还需要继续枚举,continue 外层循环。在 continue前判断 s 是否离 target 更近,如果更近,那么更新答案为 s,更新 minDiff 为 target−s。
  3. 如果 i>0 且 nums[i]=nums[i−1],那么 nums[i]和后面数字相加的结果,必然在之前算出过,所以无需跑下面的双指针,直接 continue 外层循环。(可以放在循环开头判断。)

代码展示

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n = len(nums)min_diff = inffor i in range(n - 2):x = nums[i]if i and x == nums[i - 1]:continue # 优化三# 优化一s = x + nums[i + 1] + nums[i + 2]if s > target: # 后面无论怎么选,选出的三个数的和不会比 s 还小if s - target < min_diff:ans = s # 由于下一行直接 break,这里无需更新 min_diffbreak# 优化二s = x + nums[-2] + nums[-1]if s < target:# x 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了if target - s < min_diff:min_diff = target - sans = scontinue# 双指针j, k = i + 1, n - 1while j < k:s = x + nums[j] + nums[k]if s == target:return sif s > target:if s - target < min_diff: # s 与 target 更近min_diff = s - targetans = sk -= 1else:if target - s < min_diff: # s 与 target 更近min_diff = target - sans = sj += 1return ans

复杂度分析

  1. 时间复杂度:O( n 2 n^2 n2),其中 n 为 nums 的长度。排序 O(nlogn)。外层循环枚举第一个数,然后O(n)双指针。所以总的时间复杂度为 O( n 2 n^2 n2)。
  2. 空间复杂度:O(1)。返回值不计入,忽略排序的栈开销。

相关标签

  • 数组
  • 双指针
  • 排序

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

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

相关文章

C 语 言 - - - 文 件 操 作

C 语 言 - - - 文 件 操 作 文 件文 件 名文 件 操 作fopenfclose 文 件 的 顺 序 读 写fputcfgetcfputsfgetsfprintffscanffwritefread 流文 件 的 随 机 读 写fseekftellrewind 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你…

Walrus 与 Pudgy Penguins 达成合作,为 Web3 头部 IP 引入去中心化存储

以将深受喜爱的数字藏品赋予生命而闻名的 IP 与品牌开发公司 Pudgy Penguins&#xff0c;现已集成 Walrus&#xff0c;用于存储和管理其日益增长的数字媒体资源库&#xff0c;包括在其产品和社区体验中使用的贴纸和 GIF。团队将率先通过 Tusky&#xff08;Walrus 的用户友好型文…

2019ICPC陕西省赛暨陕西邀请赛题解 BCDEF HIJKL

共111支队伍&#xff0c;获奖情况&#xff08;大概&#xff09; 铜牌66 —— 3 296 银牌33 —— 4 391 金牌 11 —— 6 808 题目难度&#xff08;过题&#xff09;L F E B C I J D K H Problem - L - Codeforces 思路&#xff1a;注意到答案是连乘&#xff0c;只要有0…

5块钱的无忧套餐卡可以变成流量卡吗

电信的 5 块钱无忧套餐卡理论上可以变成流量卡&#xff0c;但会受到一些条件限制&#xff0c;以下是具体介绍&#xff1a; 中国电信无忧卡简介 中国电信无忧卡是电信推出的低月租套餐&#xff0c;月租仅 5 元&#xff0c;包含 200M 国内流量、来电显示和 189 邮箱&#xff0c;全…

SpringBoot校园失物招领平台源码开发实现

概述 实用的​​SpringBoot校园失物招领平台​​完整项目源码&#xff0c;帮助开发者快速构建校园失物招领系统。该项目采用SpringBootVue前后端分离架构&#xff0c;包含完整的注册登录、信息发布、认领管理等模块&#xff0c;是学习企业级项目开发的优秀范例 主要内容 1. …

如何在纯C中实现类、继承和多态(小白友好版)

基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法&#xff08;函数指针&#xff09; void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…

51单片机入门教程——每个音符对应的重装载值

前言 本教程基于B站江协科技课程进行个人学习整理&#xff0c;专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题&#xff0c;也助力新手快速掌握51单片机核心知识&#xff0c;实现从C语言理论到单片机实践应用的高效过渡 。

股票单因子的检验方法有哪些?

股票单因子的检验方法主要包括以下四类方法及相关指标&#xff1a; 一、统计指标检验 IC值分析法 定义&#xff1a;IC值&#xff08;信息系数&#xff09;衡量因子值与股票未来收益的相关性&#xff0c;包括两种计算方式&#xff1a; Normal IC&#xff1a;基于Pearson相关系数…

洛谷 P8606 [蓝桥杯 2013 国 B] 高僧斗法 博弈论

题目 传送门 P8606 [蓝桥杯 2013 国 B] 高僧斗法 - 洛谷 思路 这个题就比较考验博弈的基本题型和转换能力了&#xff1b; 这个题是nim博弈>阶梯博弈 再将小和尚的移动转化为阶梯上石子的移动&#xff1a;两个小和尚之间可以移动的距离&#xff0c;看做阶梯上的石子&…

《政治最后的日子》章节

政治与中世纪教会的类比性衰落 作者提出现代民族国家正重复中世纪教会的衰落轨迹&#xff1a; 两者均曾作为社会组织核心存在约5个世纪 晚期都成为生产力阻碍&#xff08;中世纪教会税收负担/现代国家官僚低效&#xff09; 末期均出现管理者普遍腐败与公众蔑视&#xff08;…

微软开源推理模型:Phi-4-reasoning-plus

Phi-4-reasoning-plus 技术解读 一、模型概述 Phi-4-reasoning-plus 是微软研究院开发的一种前沿开源推理模型&#xff0c;基于 Phi-4 通过监督微调和强化学习进一步训练而成。该模型专注于高质量和高级推理能力的培养&#xff0c;旨在为小型高效模型提供强大的推理性能。其训…

文学与社会学是否只是在做解释的工作?

目录 一、文学&#xff1a;从抒情到解释的转变 &#xff08;一&#xff09;文学从来不只是“虚构” &#xff08;二&#xff09;文学的解释&#xff0c;是“经验的再组织” 二、社会学&#xff1a;用理论语言重写社会现实 &#xff08;一&#xff09;社会学的“科学化”与…

Flink基础整理

文章目录 前言1.Flink系统架构2.编程模型(API层次结构)3.DataSet和DataStream区别4.Flink的批流统一5.Flink的状态后端6.Flink有哪些状态类型7.Flink并行度前言 提示:下面是根据网络或AI整理: 1.Flink系统架构 用户在客户端提交作业(Job)到服务端。服务端为分布式的主从…

mq消息可靠性传送

mq消息传送 开启消息发布确认模式 def publish(self, message):"""发布消息&#xff08;自动重连&#xff09;"""for i in range(3):try:message_ json.dumps(message, ensure_asciiFalse)self.ensure_connection()# 开启 confirm 模式&#x…

【quantity】10 面积单位模块(area.rs)

一、源码 我们可以实现面积单位文件&#xff0c;包含k&#xff08;千&#xff09;、d&#xff08;分&#xff09;、c&#xff08;厘&#xff09;、m&#xff08;毫&#xff09;前缀的面积量。面积的基本单位是平方米&#xff08;SquareMeter&#xff09;。 以下是area.rs的实…

运算放大器的主要技术指标

运放&#xff08;运算放大器&#xff09;是一种基础电子器件&#xff0c;具有输入阻抗高、开环放大倍数大、输入端电流小、同相端与反相端电压几乎相等等特点。在选型时&#xff0c;需要考虑技术指标如输入失调电压、输入失调电压漂移、输入失调电流、共模抑制比、压摆率、建立…

Docker 服务搭建

&#x1f4a2;欢迎来到张翊尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Docker 服务搭建在 Ubuntu 上安装 Docker更新软件…

CRM系统接入DeepSeek大模型应用场景方案

1. 项目背景与目标 在当前数字化转型的浪潮中&#xff0c;客户关系管理&#xff08;CRM&#xff09;系统已成为企业提升客户服务效率、优化销售流程的核心工具。然而&#xff0c;传统CRM系统普遍面临数据处理能力有限、客户洞察深度不足、响应效率低下等问题。例如&#xff0c…

步进电机中断函数解释

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函数逐行解释 下面我们对 STM32 项目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数进行逐行解析&#xff0c;帮助初学者理解每一行代码的作用。此函数是在定时器产生更新中断时被调…

什么是Linux中的systemd?

写在前面 为什么要回过头来复习linux的system的&#xff0c;最近在研究DELL EMC的PowerStore存储系统&#xff0c;其底层是基于CoreOS开发的&#xff0c;这套操作系统是基于Systemd来设计的。所以要深入了解PowerStore就必须对systemd做详细了解。 systemd 是一个用于 Linux …