面试经典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.mzph.cn/news/679222.shtml

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

相关文章

ClickHouse时区

clickhouse数据库的时间是UTC时间。服务器默认的是上海时间。 sudo vim /etc/clickhouse-server/config.xml clickhouse默认的时区是注释的就是UTC时间 %F 表示日期,格式为 YYYY-MM-DD。%T 表示时间,格式为 HH:MM:SS。 因此,formatDateT…

主干网络篇 | YOLOv5/v7 更换主干网络为 VGG13 / VGG16 / VGG19 | 对比实验必备

论文地址:https://arxiv.org/pdf/1409.1556.pdf 在这项工作中,我们研究了卷积网络深度对其在大规模图像识别环境中准确性的影响。我们的主要贡献是对使用非常小(33)卷积滤波器的架构的不断增加深度的网络进行了彻底评估,这表明通过将深度推进到16-19个权重层,可以在先前…

第72讲后台管理Container布局实现

新建layout目录 登录成功后&#xff0c;跳转layout布局容器页面 login页面&#xff1a; 导入router import router from "/router";登录成功&#xff0c;跳转后台管理页面 选用布局容器&#xff1a; <template><div class"common-layout">…

javaweb物业管理系统jsp项目

文章目录 物业管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 物业管理系统 可用作javaweb项目、servlet项目、jsp项目的项目设计 一、系统演示 物业管理系统 二、项目介绍 语言&a…

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

Acwing---839. 模拟堆

模拟堆 1.题目2.基本思想3.代码实现 1.题目 维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08…

好看的登录界面源码,希望您喜欢

闲来无事&#xff0c;写几个好看的html界面玩一玩&#xff01; 登录界面一&#xff1a; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

MySQL表的基础操作

创建表 create table 表名&#xff08;列名 类型&#xff0c;列名 类型……&#xff09; 注意 1.在进行表操作之前都必须选中数据库 2.表名&#xff0c;列名等一般不可以与关键字相同&#xff0c;如果确定相同&#xff0c;就必须用反引号引住 3.可以使用comment来增加字段说…

c++水仙花数

一.什么是水仙花数 水仙花数是一个三位数它的个位,十位,百位的三次幂相加的和为他本身 例如:1*1*15*5*53*3*3153及153为水仙花数 二.代码 三.样例

98.网游逆向分析与插件开发-网络通信封包解析-定位明文发送数据的关键函数

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解 通过上一个内容有了对网络通信架构有一个简单认识了解&#xff0c;对于我们重要的点是 组织数据 到 加密数据之间的过程&#xff0c;这个过程的数据我们是可以看懂的&#xff0c;…

【python5】闭包/装饰器,

文章目录 1.闭包和装饰器&#xff1a;函数里return就是闭包2.解析eeprom&#xff1a;如下是二进制文件&#xff0c;C8是一个字节3.json/configparser/optparse&#xff1a;json.dumps&#xff08;将字典转化为字符串&#xff0c;将json信息写进文件&#xff09;&#xff0c;jso…

华为环网双机接入IPTV网络部署案例

环网双机接入IPTV网络部署案例 组网图形 图2 环网双机场景IPTV基本组网图 方案简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 方案简介 随着IPTV业务的迅速发展&#xff0c;IPTV平台承载的用户也越来越多&#xff0c;用户对IPTV直播业务的可靠性要求越来越高。…

图灵日记--MapSet字符串常量池反射枚举Lambda表达式泛型

目录 搜索树概念实现性能分析和 java 类集的关系 搜索概念及场景模型 Map的使用Map常用方法 Set的说明常见方法说明 哈希表冲突-避免-负载因子调节冲突-解决-闭散列冲突-解决-开散列/哈希桶冲突严重时的解决办法 实现和 java 类集的关系 字符串常量池String对象创建intern方法 …

深入理解Go的垃圾回收机制

导语 如果你是一位Golang的开发者&#xff0c;你一定对于语言特性和详细结构有所了解。但是&#xff0c;你是否曾经停下来深入研究过Golang背后复杂而强大的垃圾回收&#xff08;GC&#xff09;机制&#xff1f;在这篇文章中&#xff0c;我们将具体深入探讨Golang垃圾回收机制…

机器学习系列——(十五)随机森林回归

引言 在机器学习的众多算法中&#xff0c;随机森林以其出色的准确率、对高维数据的处理能力以及对训练数据集的异常值的鲁棒性而广受欢迎。它是一种集成学习方法&#xff0c;通过构建多个决策树来进行预测和分类。本文将重点介绍随机森林在回归问题中的应用&#xff0c;即随机…

DP读书:《openEuler操作系统》(九)从IPC到网卡到卡驱动程序

DP读书&#xff1a;《openEuler操作系统》从IPC到网卡到卡驱动程序&#xff09; 上章回顾_SPI上节回顾_TCP 网卡驱动程序简介1.设备驱动2.总线与设备3.网卡及其抽象 驱动程序的注册与注销1. 注册2. 注销 设备初始化1. 硬件初始化2. 软件初始化 设备的打开与关闭1. 设备的打开2.…

微软和苏黎世联邦理工学院开源SliceGPT创新压缩技术节省大量部署资源;OpenAI成立儿童安全团队,防AI误用

&#x1f989; AI新闻 &#x1f680; 微软和苏黎世联邦理工学院开源SliceGPT创新压缩技术节省大量部署资源 摘要&#xff1a;微软和苏黎世联邦理工学院研究人员开源了SliceGPT&#xff0c;通过对大模型的权重矩阵进行压缩切片&#xff0c;实现了模型紧缩&#xff0c;节省了部…

Spring Boot 笔记 002 整合mybatis做数据库读取

概念 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objec…

书生谱语-大语言模型测试demo

课程内容简介 1.作业 demo1 demo2 demo3 demo4

【leetcode】206. 反转链表(简单)题解学习

题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …