【面试经典150 | 双指针】三数之和

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:暴力枚举
    • 方法二:双指针
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【双指针】【数组】


题目来源

面试经典150 | 15. 三数之和


题目解读

给你一个整数数组 nums,找出其中所有同时满足以下条件的三元组:

  • nums[i] + nums[j] + nums[k] = 0
  • i != jj != kk != i

注意:答案中不允许包含重复的三元组。


解题思路

方法一:暴力枚举

找出和为 0 的三元组,最容易想到的方法就是枚举所有可能的三元组,然后求和。但是答案中不允许包含重复的三元组,因此想到先进行排序处理,将数组 nums 中所有重复的元素放在一起,方便后续的去重处理,这一步也是后续几种方法的必要的步骤。

枚举所有可能的三元组的方法最容易想到,但是时间复杂度为 O ( n 3 ) O(n^3) O(n3) n n n 为数组 nums 的长度,本题的数据量达到 1 0 3 10^3 103,必然超时。

方法二:双指针

为了应对重复答案的情况出现,我们首先对数组 nums 进行排序处理。

接着,枚举第一个加数 nums[i],剩下两个加数的查找我们可以使用 两数之和 中双指针的思想来解决,具体地:

  • 枚举第一个加数 nums[i]
  • 如果 i >= 1nums[i] = nums[i-1],说明数字 nums[i] 已经作为第一个元素了, 我们需要则继续枚举下一个位置的 nums[i] 作为第一个加数;
  • 否则,利用双指针查找第二、三个加数:
  • 维护双指针 jk 分别指向需要查找的第二、三个数字位置,初始化 j = i + 1k = n - 1
  • 如果 nums[i] + nums[j] + nums[k] > 0,则 --k
  • 如果 nums[i] + nums[j] + nums[k] < 0,则 ++j
  • 如果 nums[i] + nums[j] + nums[k] = 0,则当前的 {nums[i], nums[j], nums[k]} 为一个满足条件的三元组并加入到 答案数组 ret 中,并且右移 j 到下一个与数字 nums[j] 的位置,左移 k 到下一个与数字 nums[k] 的位置 。

最后,返回答案数组 ret

优化

本题中还有一些可以优化的地方:

  • 如果 n < 3,即数组的长度小于 3,不会有三个数;
  • 如果排序后的 nums[0] > 0,表明数组中的所有数字都大于 0,一定不会有和为 0 的三元组;
  • 如果排序后的 nums[n-1] > 0,表明数组中的所有数字都小于 0,一定不会有和为 0 的三元组;

加上以上的优化代码,双指针解法就是最优的解法了。

实现代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;int n = nums.size();sort(nums.begin(), nums.end());if(n < 3 || nums[0] > 0 || nums[n-1] < 0){return ret;}int i, j, k;for(i = 0; i < n-2; ++i){if(i && nums[i] == nums[i-1]){continue;}j = i + 1;k = n - 1;while(j < k){int target = nums[i] + nums[j] + nums[k];if(target > 0){--k;}else if(target < 0){++j;}else{ret.push_back({nums[i], nums[j], nums[k]});++j;--k;while(j < k && nums[j] == nums[j-1]) ++j;while(j < k && nums[k] == nums[k + 1]) --k;}}}return ret;}
};

复杂度分析

时间复杂度: O ( n 2 ) O(n^2) O(n2) n n n 为数组 nums 的长度,枚举第一个加数的时间复杂度为 O ( n ) O(n) O(n),利用双指针查找满足条件的第二、三个加数的时间复杂度为 O ( n ) O(n) O(n),因此总的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( l o g n ) O(logn) O(logn),双指针解法仅使用有限个额外空间,排序占用的额外空间为 O ( l o g n ) O(logn) O(logn),因此空间复杂度为 O ( l o g n ) O(logn) O(logn)

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85268.shtml

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

相关文章

Selenium自动化测试框架工作原理你明白了吗?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 一、Selenium是什么&#xff1f;   用官网的一句话来讲&#xff1a;Selenium automates browsers. Tha…

【Python Fastapi】js上传文件,fastapi处理,js显示回传信息

python from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from typing import List import requestsapp FastAPI()# 配置静态文件目录 app.mount("/static"…

排序算法-----归并排序

目录 前言&#xff1a; 归并排序 1. 定义 2.算法过程讲解 2.1大致思路 2.2图解示例 拆分合成步骤 ​编辑 相关动态图 3.代码实现&#xff08;C语言&#xff09; 4.算法分析 4.1时间复杂度 4.2空间复杂度 4.3稳定性 前言&#xff1a; 今天我们就开始学习新的排序算法…

LLaMa

文章目录 Problems403 代码文件LLaMA: Open and Efficient Foundation Language Models方法预训练数据结构优化器一些加速的方法 结果Common Sense ReasoningClosed-book Question AnsweringReading ComprehensionMassive Multitask Language Understanding Instruction Finetu…

yo!这里是c++中的多态

前言 在学完继承之后&#xff0c;紧接着我们来认识多态&#xff0c;建议继承不太熟的先把继承部分的知识点搞熟&#xff0c;再来学习多态&#xff0c;否则会走火入魔&#xff0c;会混乱。因为多态是建立在继承的基础之上&#xff0c;而且多态中还存在与继承类似的概念&#xff…

QT-day2

1、完善登录框 头文件 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> //消息对话框类头文件 #include <QDebug> #include <QPushButton> #include "second.h"QT_BEGIN_NAMESPACE namespace…

【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误

目标:认识代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号的左右是否需要空格”&#xff0c;"一句结束是否是要加;”等 为什么要使用代码规范&#xff1f; 在团队开发时&#xff0c;提高代码的可读性。 在创建项目时&#xff0c;我们选择的就是一套完整的代码…

STM32F103RCT6学习笔记2:串口通信

今日开始快速掌握这款STM32F103RCT6芯片的环境与编程开发&#xff0c;有关基础知识的部分不会多唠&#xff0c;直接实践与运用&#xff01;文章贴出代码测试工程与测试效果图&#xff1a; 目录 串口通信实验计划&#xff1a; 串口通信配置代码&#xff1a; 测试效果图&#…

MQ - 22 Kafka集群架构设计与实现

文章目录 导图概述数据可靠性副本拉取 Leader 数据动态维护可用副本集合控制 Leader 切换和数据截断安全控制可观测性总结导图 概述 MQ - 15 集群篇_如何构建分布式的消息队列集群(下)说了基于 ZooKeeper 和 KRaft 来构建集群的两种方式,在这里就不再重复。 这里我们详细分…

【力扣每日一题】2023.9.22 将钱分给最多的儿童

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一笔钱和一些小朋友&#xff0c;要我们把这些钱分完不能剩&#xff0c;并且不能有小朋友被分到4元以及每个人至少分到1元&#xff…

Splashtop 的卓越安全性获得 ISO 27001 认证

在快速发展的数字环境中&#xff0c;实施强有力的安全措施尤为重要。Splashtop 始终优先考虑安全性&#xff0c;一如既往地在远程访问行业坚持以身作则。 我们最近宣布 Splashtop 已获得 ISO/IEC 27001 认证&#xff0c;证明了我们对信息安全、数据保护和合规性最高标准的坚定…

有没有免费的人才测评工具,免费的人才测评系统软件?

最近看到知乎上有个问题挺火的&#xff0c;就是问有没有免费的人才测评工具&#xff0c;人才测系统软件目前是有挺多的&#xff0c;但是要说免费&#xff0c;我还真心没有听说过&#xff0c;不但不免费&#xff0c;比较专业的人才测评公司&#xff0c;价格还是非常高的。 人才…

有趣的设计模式——适配器模式让两脚插头也能使用三孔插板

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 场景与问题 众所周知&#xff0c;我们国家的生活用电的电压是220V而笔记本电脑、手机等电子设备的工作压没有这么高。为了使笔记本、手机等设备可以使用220V的生活用电就需…

3、Elasticsearch功能使用

第4章 功能使用 4.1 Java API 操作 随着 Elasticsearch 8.x 新版本的到来&#xff0c;Type 的概念被废除&#xff0c;为了适应这种数据结构的改 变&#xff0c;Elasticsearch 官方从 7.15 版本开始建议使用新的 Elasticsearch Java Client。 4.1.1 增加依赖关系 <propertie…

火花塞工作原理

1.红旗H9轿车2023款发布 2023年元旦过后&#xff0c;红旗汽车在人民大会堂举办了红旗H9的新车发布会&#xff0c;一汽红旗全新的H9豪华轿车终于出炉了全套的配置参数&#xff0c;红旗H9的车身长度达到5137mm&#xff0c;宽度1904mm&#xff0c;轴距3060mm&#xff0c;总高则控…

2023-9-22 滑雪

题目链接&#xff1a;滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango前后端分离》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

VPN协议是如何工作的

VPN&#xff0c;全名 Virtual Private Network&#xff0c;虚拟专用网&#xff0c;就是利用开放的公众网络&#xff0c;建立专用数据传输通道&#xff0c;将远程的分支机构、移动办公人员等连接起来。 VPN 通过隧道技术在公众网络上仿真一条点到点的专线&#xff0c;是通过利用…

电脑桌面透明便签软件是哪个?

在现代快节奏的工作环境中&#xff0c;许多上班族都希望能够在电脑桌面上方便地记录工作资料、重要事项、工作流程等内容。为了解决这个问题&#xff0c;一款优秀的电脑桌面便签软件是必不可少的。在选择桌面便签软件时&#xff0c;许多用户也希望便签软件能够与电脑桌面壁纸相…

携手共赴数智未来|维视智造出席2023英特尔工业物联网大会

​ ​ 9月20日&#xff0c;“数智芯生力” 2023 英特尔工业物联网大会”于上海隆重举办。作为主办方&#xff0c;英特尔邀请了赋能工业数字化技术创新的多位合作伙伴&#xff0c;展示当前中国工业物联网领域的优秀技术与成果&#xff0c;共聚一堂积极探讨数字化机器视觉、控制…