面试经典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://xiahunao.cn/news/2779237.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

猫头虎分享已解决Bug || IndexError: index 3 is out of bounds for axis 0 with size 3

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

解决挂梯子 无法正常上网 的问题

方法: 打开 控制面板 👉 网络和Internet 👉 Internet选项 👉 连接 👉 局域网设置 👉 代理服务器 👉 取消选项 有问题可参考下图

案例:三台主机实现 级联复制

介绍:级联复制架构 级联复制架构 是一种特殊的主从结构,之前聊到的几种主从结构都只有两层,但级联复制架构中会有三层,关系如下: 也就是在级联复制架构中,存在两层从库,这实际上属于一主多从架…

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc,在编写函数处理远端传递来的candidate时报错了,具体信息如下。国内关于webrtc的资料很少,所以去国外社区转了一圈,回来记录一下报错的解决方案 其实这个bug也好解决,根据报错信息可以判断是RTCIceCand…

C语言第二十二弹---指针(六)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么? 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…

龙年,大吉

(1) 没有成功的企业,只有时代的企业。这就是人们老说的:天道酬勤。虽然这句话被人说滥了,虽然这句话被人说到反感了,但事实就是这样。 得道者多助。 (2) 人有三大运、三小运。 三大运…

Python基础语法(内置Python, pycharm配置方式)

一.工具安装与配置 1.Python解释器的安装 官网网址:https://www.python.org/ 选择downloads即可(Windows用户点击Windows, 苹果用户点击macOS) 找到最新版本, 并选择 Download Windows installer (64-bit) 下载完成后可在得到一个安装包进行安装(安装时间较长) 安装完成后…

【JMX】JAVA监控的基石

目录 1.概述 2.MBean 2.1.Standard MBean 2.2.Dynamic MBean 2.3.Model Bean 2.4.Dynamic MBean和Model Bean的区别 2.5.MXBean 2.6.Open Bean 3.控制台 1.概述 什么是JMX,首先来看一段对话: Java Management Extensions(JMX&#…

【Wio Terminal教程】使用LCD屏幕(4)

使用LCD屏幕(4) 一、TFT LCD的API例子1、实用图形2、数据显示3、字体4、作为背景显示 二、如何在Wio Terminal上使用LVGL图形库1、安装Seeed_Arduino_LvGL2、示例1. Bench Mark2. Stress Test3.资源 一、TFT LCD的API例子 本节为TFT LCD库的例子提供了一…

ERROR: Could not build wheels for roslz4

Python bugs 最近在安装python的rosbag包时出现了诸多问题,特别记录下。 python版本:3.11 系统版本:Windows10 x86_64 使用conda虚拟环境进行包管理。 运行命令 pip3 install roslz4 --extra-index-url https://rospypi.github.io/simple…

【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

|Python新手小白低级教程之项目篇——turtle库|第一章:turtle库基础(1)

项目篇—文章目录 一、预告二、turtle基础1.导入2.画图代码(1)turtle.forward(长度)练习1.1 画线段 (2)turtle.left()和turtle.right()操作符练习2.1 画出边长为100正方形练习2.2 画出边长为100的三角形 (3&#xff09…

腾讯云4核8G12M轻量应用服务器性能够用吗?支持多少人?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

Web前端-移动web开发_rem布局

文章目录 移动web开发之rem布局1.0 rem基础1.1 rem单位(重点)1.2 em单位(了解)1.3 媒体查询什么是媒体查询媒体查询语法规范 1.4 less 基础维护css弊端Less 介绍Less安装Less 使用之变量使用node编译less的指令Less 编译 vocode Less 插件Less 嵌套Less 运算Less中的Mixin混入L…

车载测试Vector工具——常见问题汇总

车载测试Vector工具——常见问题汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看一眼都是你的…

C++重新入门-循环

目录 1.循环类型 while循环: for循环 基于范围的for循环(C11) do...while 循环 2.循环控制语句 3.无限循环 有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着…

《零基础实践深度学习》基于线性回归实现波士顿房价预测任务1.3.3

1.3.3 基于线性回归实现波士顿房价预测任务 深度学习不仅实现了模型的端到端学习,还推动了人工智能进入工业大生产阶段,产生了标准化、自动化和模块化的通用框架。不同场景的深度学习模型具备一定的通用性,五个步骤即可完成模型的构建和训练&…

vs2019 - signtool签名和验签的手工操作

文章目录 vs2019 - signtool签名和验签的手工操作概述笔记导入根证书时间戳服务器的选择code sign - 签名文件在代码签名(code sign)前后的区别签名后, 查看属性, 是正常的.用signtool命令行进行验签移除签名END vs2019 - signtool签名和验签的手工操作 概述 signtool是进行c…

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用💖 基础命令💖 内存优化💖 完全删除mysql ⭐结束 ⭐前言 大家好,我是yma16,linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中,内存分配是通过几种…

Linux---网络基础

计算机中的常见概念 协议(Protocol): 协议是计算机网络中用于通信的规则和约定的集合。它规定了数据传输的格式、序列、错误检测和纠正方法等。常见的网络协议包括TCP/IP、HTTP、FTP等。 IP地址(IP Address)&#xf…