当前位置: 首页 > news >正文

LeetCode_16_中等_最接近的三数之和

文章目录

  • 1. 题目
  • 2. 思路及代码实现(Python)
    • 2.1 排序 + 双指针


1. 题目

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

返回这三个数的和。

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

示例 1:

输入: n u m s = [ − 1 , 2 , 1 , − 4 ] , t a r g e t = 1 nums = [-1,2,1,-4], target = 1 nums=[1,2,1,4],target=1
输出:2
解释:与 t a r g e t target target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入: n u m s = [ 0 , 0 , 0 ] , t a r g e t = 1 nums = [0,0,0], target = 1 nums=[0,0,0],target=1
输出:0


提示

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

2. 思路及代码实现(Python)

2.1 排序 + 双指针

类似于前文,求三数之和的《LeetCode_15_中等_三数之和》,可以考虑l对数组排序后用双指针进行快速搜索。而本题不是求和为固定值的三数,转为求最接近目标值 t a r g e t target target 的三元组,即三数之和与目标值的差值的绝对值最小。

同样是先排序(升序),当固定了第一个值时,如果三个数之和大于等于 t a r g e t target target,此时增加第二个值只会增大三数之和,离目标值越来越远,因此当达到了这个边界时,不会有固定第一个、第三个值之后的其他组合,此时移动第二个值无效,因此出现该情况移动第三个值的索引;若三数之和达到另一个边界,小于目标值,此时固定第一第二个值时,移动第三个值不会比当前的组合更好,因此可以移动第二个值。

时间复杂度显然为 O ( N 2 ) O(N^2) O(N2),空间复杂度为 O ( N ) O(N) O(N),相比于题15的三数之和,区别在于需要根据三树之和与目标值的差值来更新最优的和,而逻辑基本一致。

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n = len(nums)best = 10**7# 根据差值的绝对值来更新答案def update(cur):nonlocal bestif abs(cur - target) < abs(best - target):best = cur# 枚举 afor i in range(n):# 保证和上一次枚举的元素不相等if i > 0 and nums[i] == nums[i - 1]:continue# 使用双指针枚举 b 和 cj, k = i + 1, n - 1while j < k:s = nums[i] + nums[j] + nums[k]# 如果和为 target 直接返回答案if s == target:return targetupdate(s)if s > target:# 如果和大于 target,移动 c 对应的指针k0 = k - 1# 移动到下一个不相等的元素while j < k0 and nums[k0] == nums[k]:k0 -= 1k = k0else:# 如果和小于 target,移动 b 对应的指针j0 = j + 1# 移动到下一个不相等的元素while j0 < k and nums[j0] == nums[j]:j0 += 1j = j0return best

执行用时:578 ms
消耗内存:16.52 MB

参考来源:力扣官方题解

相关文章:

  • 【网络】:网络套接字(UDP)
  • 用Visual Studio Code创建JavaScript运行环境【2024版】
  • ❤搭建一个Springboot项目(ltbjava)
  • idea控制台出现乱码的解决方案
  • nltk关键字抽取与轻量级搜索引擎(Whoosh, ElasticSearcher)
  • 代码随想录算法训练营第17天
  • 运行yolo v8 YOLOv8-CPP-Inference C++部署遇到的问题
  • SQL Server ISO镜像文件安装
  • 【C++】类和对象(一)
  • 代理IP在游戏中的作用有哪些?
  • MyBaties-增删查改
  • MongoDB日期存储与查询、@Query、嵌套字段查询实战总结
  • 【ArcGIS微课1000例】0099:土地利用变化分析
  • 路飞项目--04
  • 防御保护笔记02
  • php的引用
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6 ...操作符
  • gf框架之分页模块(五) - 自定义分页
  • 浮现式设计
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单基于spring的redis配置(单机和集群模式)
  • 力扣(LeetCode)965
  • 前端自动化解决方案
  • 删除表内多余的重复数据
  • 微服务框架lagom
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #pragma 指令
  • (31)对象的克隆
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (一)RocketMQ初步认识
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Sql Server 保留几位小数的两种做法
  • (转)Sublime Text3配置Lua运行环境
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Micro Framework初体验
  • .NET 设计模式初探
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET8使用VS2022打包Docker镜像
  • .Net实现SCrypt Hash加密
  • .net专家(张羿专栏)
  • /etc/motd and /etc/issue
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ C++ ] 类和对象( 下 )
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰