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

补习吧 一家专门做家教的网站青岛建设厅网站

补习吧 一家专门做家教的网站,青岛建设厅网站,北京朝阳官方平台,中国建筑工程网承包企业管理系统16. 最接近的三数之和 题目描述思路讲解代码展示复杂度分析相关标签 题目描述 思路讲解 思路和 15. 三数之和 类似,排序后,枚举 nums[i] 作为第一个数,那么问题变成找到另外两个数,使得这三个数的和与 target 最接近,…

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.dtcms.com/wzjs/603338.html

相关文章:

  • 做外贸哪个网站最好中国企业500强搜索版
  • 黄石下陆区建设局网站怎么把平台推广出去
  • 教学资源系统网站建设方案重庆在线网站推广
  • 章丘区当地网站建设哪家好wordpress 分享文章标题
  • 高州网站建设全国企业信息系统网官网
  • 设计好看的网站哈尔滨百度优化
  • 海南省建设人力资源网站科技型中小企业认定条件
  • 网页制作购物网站wordpress md5解密
  • 罗琳做的网站读后感页面设计模板
  • 河南做网站最好的公司网站建设管理的建议
  • 做网站的素材都在哪里下载电商网站代码
  • 网站工程师是做什么的工作励志的句子 正能量
  • 通辽做网站制作环翠区网站建设
  • 企业只有建立了自己的网站长春网络网站制作开发
  • 黄岐建网站如何查看一个网站流量
  • 北京建设部网站如何刷网站排名
  • wordpress网站导入数据库网页设计实训总结3000字大学篇
  • ih5做pc 网站推广自身网站
  • 惠阳住房与规划建设局网站香奈儿电子商务网站建设策划书
  • 唐山cms模板建站网站建设郑州
  • 团队建设网站网站设计类论文怎么做
  • 优秀网站设计推荐宜州设计公司
  • 是想建个网站 用本地做服务器网站的商桥怎么做
  • 宁波seo是什么意思搜索引擎优化的核心是
  • 两个路由器做双网站网站建设费会计账务处理
  • 微信网页网站怎么做软件工程课程网站开发
  • 网站常见结构有那些专业做网站建设设计
  • 做网站给文件不侵权麦云短链接
  • 如何在国外网站做翻译兼职网页设计基础知识点考试
  • 深圳网站制作必找祥奔科技公司装修装饰