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

面试经典150题——三数之和

​"The road to success and the road to failure are almost exactly the same." - Colin R. Davis

aerial photography of mountain range covered with snow under white and blue sky at daytime

1. 题目描述

2.  题目分析与解析

2.1 思路一——暴力方法

因为三个数相加为0,那么说明其中两个加数的和与另一个加数为相反数则满足题意。所以可以得到暴力方法:两层循环相加两个数,第三层循环判断是否和与当前数是否为相反数。

但是这种算法不用想也会超时,因为复杂度已经到达了O(n^3),所以我们再来想想怎么优化。

2.2 思路二——双指针

对于这种数组的题目,因为它内容是杂乱无序的,我们应该想到将它先进行排序。因为排序后的数组这个有序的信息很可能帮助我们更快地解决题目,所以对于数组问题求解找不到思路的先想想如果它是个有序数组你会怎么做。

对于题目中给出的示例:

如果我们先将它排序,会得到:nums = [-4, -1, -1, 0, 1, 2]:

看到这里有没有一点感觉?如果我们将一个指针指向第一个数,我们只需要考虑它后面的数字中任意两个数字之和为这个指针的相反数就行。而对于有序数组而言,任意两个数字之和是某一个target的值我们之前讲过可以使用双指针分别指向头尾,向目标缩进,而且由于它只需要遍历整个数组一次,因此其时间复杂度为O(N)。再加上一个循环来遍历需要的target,那么就可以得到时间复杂度为O(N^2)的算法。

基本思路为:

  1. 使用指针 i表示需要的target,从头到尾遍历数组

  2. 使用head与end指针,分别指向i+1nums.length - 1的位置

  3. 判断head与end的值的和target的相反数(也就是nums[i]的相反数)的大小

    • 如果大于 - target,则end--

    • 如果小于 - target,则head++

    • 如果相等说明head+end+target刚好为0,满足题意加入结果集,head++,end--

    • 直到 end >= head 退出

但是我们还需要注意题目提到了:

因此我们还需要考虑重复的情况,也就是

  • 对于 i 指向的target与 i + 1指向的target如果相同,我们需要排除掉,因为这回得到相同的三元组结果,因为相同的target的所有可能结果在第一次已经全部获得了。

  • 同时在我们进行判断head与end求和的过程中,如果head++后的值等于head的值就需要跳过,end--后的值等于end的值也需要跳过,因为这相当于同样的加数。

因此根据上述思路就可以写处我们的代码了。

3. 代码实现

3.1 暴力解法

3.2 双指针

4. 运行结果

第一种方法会超时,第二种结果如下:

5. 相关复杂度分析

5.1 暴力解法

时间复杂度:O(N^3)

空间复杂度:O(1)

5.2 双指针

  • 时间复杂度:O(n^2),数组排序O(N log N),遍历数组O(n),双指针O(n),总体复杂度O(N log N) + O(n) * O(n) =O(n^2)

  • 空间复杂度:O(1)


http://www.kler.cn/news/234945.html

相关文章:

  • 华为问界M9:领跑未来智能交通的自动驾驶黑科技
  • python+flask+django农产品供销展销电子商务系统lkw43
  • AutoSAR(基础入门篇)8.5-C/S原理进阶
  • C/C++模板初阶
  • 【开源】SpringBoot框架开发APK检测管理系统
  • 前端学习的笔记第二篇
  • 开发板和单片机的比较
  • python-游戏篇-初级-超级画板
  • 线程-线程的创建方式与线程池基础知识
  • golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项
  • 3分钟部署完成Docker Registry及可视化管理工具Docker-UI
  • AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?
  • Java String源码剖析+面试题整理
  • 第三百一十回
  • 《21天精通IPv4 to IPv6》第10天:IPv6在物联网中的应用——如何在物联网中应用IPv4到IPv6?
  • redmi note 4x(mido) kali nethunter
  • 【2024年数据】67个“绿色金融”主题DID政策汇总(已去重)
  • HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理
  • cad基础学习
  • 工业制造:分布式控制系统(DCS),一文掌握。
  • mac电脑安装cocoapods出错,以及安装最新版本ruby方法
  • 13 年后,我如何用 Go 编写 HTTP 服务(译)
  • 解决 postman测试接口报404 Not Found
  • 第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛(软件赛)软件测试组竞赛规则及说明
  • Excel——重复项处理
  • C语言实现一个简易的环形FIFO
  • 跟着GPT学设计模式之原型模式
  • Java图形化界面编程——弹球游戏 笔记
  • jvm体系结构
  • 电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列)