《剑指 Offer》专项突破版 - 面试题 7 : 数组中和为 0 的 3 个数字(C++ 实现)

题目链接:15. 三数之和 - 力扣(LeetCode)

题目

输入一个数组,如何找出数组中所有和为 0 的 3 个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组 [-1, 0, 1, 2, -1, -4] 中有两个三元组的和为 0,它们分别是 [-1, 0, 1] 和 [-1, -1, 2]。

分析

这个题目是 "两数之和" 的加强版。如果输入的数组是排序的,就可以先固定一个数字 i,然后在排序数组中查找和为 -i 的两个数字。我们已经有了用 O(n) 时间在排序数组中找出和为给定值的两个数字的方法,由于需要固定数组中的每个数字,因此查找三元组的时间复杂度是 O(n^2)。

前面只需要 O(n) 时间在数组中找出和为给定值的两个数字的方法只适用于排序数组。可是这个题目并没有说给出的数组是排序的,因此需要先对数组排序。排序算法的时间复杂度通常是 O(nlogn),因此这种解法的总的时间复杂度是 O(nlogn) + O(n^2),仍然是 O(n^2)。

注意:为了避免出现重复的三元组,求解的过程中需要对 nums[i]、nums[j] 和 nums[k] 进行检查

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> result;int n = nums.size();for (int i = 0; i < n - 2; ++i){if (i > 0 && nums[i] == nums[i - 1])  // 跳过重复的数字continue;int target = -nums[i];int left = i + 1;int right = n - 1;while (left < right){int sum = nums[left] + nums[right];if (sum < target)++left;else if (sum > target)--right;else{result.push_back({ nums[i], nums[left], nums[right] });++left;while (left < right && nums[left] == nums[left - 1])  // 跳过重复的数字++left;--right;while (left < right && nums[right] == nums[right + 1])  // 跳过重复的数字--right;}}}return result;}
};

 

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

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

相关文章

【数值分析】数值微分

1. 基于Taylor公式的数值微分公式 f ′ ( x ) ≈ f ( x h ) − f ( x ) h , 截断误差 − f ′ ′ ( ξ ) 2 h f(x)\approx \frac{f(xh)-f(x)}{h}\,\,,\,\, 截断误差 \,\,\, - \frac{f(\xi)}{2}h f′(x)≈hf(xh)−f(x)​,截断误差−2f′′(ξ)​h f ′ ( x ) ≈ f ( x ) − f …

【JUC进阶】14. TransmittableThreadLocal

目录 1、前言 2、TransmittableThreadLocal 2.1、使用场景 2.2、基本使用 3、实现原理 4、小结 1、前言 书接上回《【JUC进阶】13. InheritableThreadLocal》&#xff0c;提到了InheritableThreadLocal虽然能进行父子线程的值传递&#xff0c;但是如果在线程池中&#x…

spring-mvc(1):Hello World

虽然目前大多数都是使用springboot来开发java程序&#xff0c;或者使用其来为其他端提供接口&#xff0c;而为其他端提供接口&#xff0c;这些功能都是依靠springmvc实现的&#xff0c;所以有必要学习一下spring-mvc&#xff0c;这样才能更好的学习springboot。 一&#xff0c…

c语言题目之九九乘法表的打印

文章目录 题目一、题目分析二&#xff0c;代码编写三&#xff0c;拓展 题目 用c语言打印九九乘法表 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目分析 在上面图我们假设一个乘法为一个单位&#xff0c;在这里我们可以看到第一行有一行一列&…

Python 3 字符串的基本使用

介绍 字符串是一个或多个字符&#xff08;字母、数字、符号&#xff09;的序列&#xff0c;可以是常量&#xff0c;也可以是变量。字符串由 Unicode 组成&#xff0c;是不可变的序列&#xff0c;这意味着它们是不变的。 由于文本是我们在日常生活中使用的一种常见数据形式&am…

掌握WPF控件:熟练常用属性(二)

WPF布局常用控件&#xff08;二&#xff09; Calendar 用于日期选择的控件。它提供了一个可视化的界面&#xff0c;可以通过它来选择特定的日期。 常用属性描述DisplayMode用来设置Calendar的显示模式&#xff0c;有三种可选值&#xff1a;默认Month&#xff08;月&#xff…

自编C++题目——输入程序

预估难度 简单 题目描述 小明编了一个输入程序&#xff0c;当用户的输入之中有<时&#xff0c;光标移动到最右边&#xff1b;当输入有>时&#xff0c;光标移动到最左边&#xff0c;当输入有^时&#xff0c;光标移动到前一个字符&#xff0c;当输入为#时&#xff0c;清…

华纳云:在Conda中环境迁移有哪些步骤

在Conda中&#xff0c;环境的迁移通常涉及两个方面&#xff1a;导出环境配置和导出环境中的包。这可以通过以下步骤来完成&#xff1a; 导出环境配置&#xff1a; 在源环境中运行以下命令&#xff0c;导出环境配置到一个 environment.yml 文件中&#xff1a; conda env expo…

SLAM第十四讲

基础知识 四元数 先将三维空间的点p(x,y,z) 变成四元数的表示q(0,x,y,z) 其中0为四元数的实部&#xff0c;x,y,z为四元数的虚部。 实部为0的四元数也叫纯虚四元数。 通过 左乘四元数&#xff…

YOLOv8 Ultralytics:使用Ultralytics框架进行SAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行SAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行SAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xf…

Rust的第一个程序

从C系出发感觉长相怪异程度只比Erlang柔和那么一点点。 教材里的猜数字字符界面游戏&#xff1a; use rand::Rng; use std::cmp::Ordering; use std::io;fn main() {println!("Guess the number!");let secret_number rand::thread_rng().gen_range(1..100);//pri…

TypeScript进阶(四)声明文件

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

P1643 完美数 题解

完美数 首先&#xff0c;介绍一下这篇题解的特邀嘉宾&#xff1a;ChatGPT4.0 传送门 题目描述 考古队员小星在一次考察中意外跌入深渊&#xff0c;穿越到了一个神秘的荒漠。这里有许多超越他认识的事物存在&#xff0c;例如许多漂浮在空中的建筑&#xff0c;例如各种奇怪的…

长亭科技-雷池WAF的安装与使用

目录 1、安装雷池 2、登录雷池 3、简单配置 4、防护测试 5、其他补充 1、安装雷池 在Linux系统上执行如下命令 &#xff08;需要docker环境&#xff0c;提前把docker、docker-compose 装好&#xff09; bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release…

PHP常用符号和函数

// 单行注解 /* */ 多行注解 引号的使用 ’ ’ 单引号,没有任何意义,不经任何处理直接拿过来; ” “双引号,php动态处理然后输出,一般用于变量. 变量形态: 一种是True 即 真的; 另一种是False 即假的 常见变量形态: string 字串(数字\汉字\等等) integer 整数(1、2、…

【电源专题】案例:不同模块同一个管脚默认状态不一样会导致什么异常?

案例背景:在产品设计中,有时候会兼容两个不同供应商同一个方案的模块。比如两个供应商使用的内部方案都是一样的芯片,封装也是兼容的。但是由于专利、LAYOUT方便、软件开发方便等角度来看,可能会存在不同模块供应商的同一个PIN脚对应的芯片内部的管脚不一样。管脚不一样那么…

java基础知识点系列——分支语句(六)

java基础知识点系列——分支语句&#xff08;六&#xff09; 流程控制 流程控制语句分类 顺序结构分支结构循环结构 顺序结构 顺序结构是程序中最简单最基本的流程控制&#xff0c;没有特定的语法结构&#xff0c;按照代码的先后顺序&#xff0c;依次执行。 if语句 if语…

39岁学JAVA来得及吗?

39岁学JAVA来得及吗? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;学习Java编…

五种嵌入式经典通信总线协议

一.先前知识 1.并行与串行 并行通信和串行通信是两种不同的数据传输方式&#xff1a; 并行通信&#xff1a;并行通信是指在同一时间使用多条并行传输的线路传输多个比特的数据。每个比特使用独立的线路进行传输&#xff0c;同时进行。这样可以在一个时钟周期内传输多个比特&…

螺纹钢负公差轧制中的测径仪应用

1、负公差轧制意义 为了满足生产使用要求&#xff0c;并根据轧制水平&#xff0c;在产品标准冲规定钢材尺寸的波动范围&#xff0c;允许钢材的实际尺寸与公称尺之间有一定的偏差&#xff0c;这个偏差一般称公差&#xff0c;公差分正、负公差&#xff0c;钢材按负公差轧制时&…