leetcode热题100.三数之和

Problem: 15. 三数之和

文章目录

  • 题目
  • 解题方法
  • 复杂度
  • Code

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

3 <= nums.length <= 3000
− 1 0 5 -10^5 105 <= nums[i] <= 1 0 5 10^5 105

解题方法

我们先考虑最朴实的解法,我们可以遍历三次数组,计算这三次的和,判断是否为零,再通过集合去重,但是这样的时间复杂度是 o ( n 3 ) o(n^3) o(n3),我们思考一下是否可以进行优化。

我们在上面的算法中计算了很多重复的值,我们可以尝试以下排序整个数组,这样我们第一次遍历结束之后,第二次遍历就不需要考虑第一次遍历的数左边的数了,实现了一次剪枝;对于第三次遍历也是一样的,我们不需要考虑第二次遍历的数左边的数。

我们考虑第二,第三次遍历,发现如果此时 nums[i] + nums[j] + nums[k] < 0, 因为 i<j<k,此时我们希望三数之和变大,所以可以右移j,判断是否等于0;同样如果 nums[i] + nums[j] + nums[k] > 0,我们期望他变小一点,则左移 k,检查是否可以等于0。

如果等于零了,说明我们找到了答案,加入最后的结果中即可

注意:关于结果的去重,对于i,left,right,我们都使用while循环排除重复的值,保证结果的唯一性

复杂度

时间复杂度:

遍历了两次数组,所以是: O ( n 2 ) O(n^2) O(n2)

空间复杂度:

添加空间复杂度, 示例: O ( n ) O(n) O(n)

Code

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums = sorted(nums)n = len(nums)ans = []i = 0 while i < n-2:while i<n and i>0 and nums[i] == nums[i-1]:i+=1if i < n-2 and nums[i+1] + nums[i+2] + nums[i]>0:breakif i < n-2 and nums[i] + nums[-1] + nums[-2] <0:i+=1continueleft,right = i+1,n-1while left<right:if nums[left]+nums[right] + nums[i] < 0:left += 1elif  nums[left]+nums[right] + nums[i] > 0:right -= 1else:ans.append([nums[i],nums[left],nums[right]])left+=1while left<right and nums[left]==nums[left-1]:left+=1right-=1while left<right and nums[right]==nums[right+1]:right-=1i+=1return ans

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

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

相关文章

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态

步进电机控制 设计思路 电路设计&#xff1a; 选用AT89C51单片机作为电路核心部件&#xff0c;外加LM016L液晶显示屏作为显示&#xff0c;显示步进电机的Fast&#xff0c;Slow&#xff0c;Stop的三个状态将AT89C51单片机所选引脚与LM016L控制引脚相连&#xff0c;再将数据通…

ASEPRITE使用笔记

aseprite学习笔记 快捷键 新建图层后,按快捷键c可以调出画布属性框放大缩小画布快捷键,鼠标滚轮移动画布快捷键,空格ctr+d,取消选取基本概念 软件五个基本区域:菜单栏、工具属性栏、工具栏、图层栏、颜色栏颜色栏分为色板和调色区域注意事项 创造时,需要把输入法调整成应…

03.net6必须熟悉的类

C#必须熟悉的类 值和实例 true&#xff0c;false ,“”,‘a’,34f,34,34m&#xff0c;“ggd”,$“gg{age}” 基本类型和常用类型 byte int char decimal float double string DateTime TimeSpan bool Array dynamic var 自动推断类型 常用类型 Object Console Math …

java创建线程的三种方式

1、实现Runnable接口 这是最常用的方法&#xff0c;需要创建一个实现Runnable接口的类&#xff0c;并重写run()方法。然后&#xff0c;创建一个Thread对象并将这个实现Runnable接口的类的实例作为参数传递给Thread的构造函数。最后&#xff0c;调用Thread对象的start()方法来启…

(2024,VMamba,交叉扫描,线性复杂度,全局感受野,动态权重)视觉状态空间模型

VMamba: Visual State Space Model 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 基础概念 3.2 2D 选择性扫描 3.3 VMamba 模型 3.3.1 整体架构 3.3.2 VSS…

大数据开发之Kafka(broker、消费者、eagle监控、kraft模式)

第 4 章&#xff1a;Kafka Broker 4.1 Kafka Broker工作流程 4.1.1 Zookeeper存储的Kafka的信息 1、查看zookeeper中的kafka节点所存储的信息 启动Zookeeper客户端 [atguiguhadoop104 zookeeper-3.5.7]$ bin/zkCli.sh 通过ls命令列出kafka节点内容 [zk: localhost:2181(CO…

Windows11添加美式(纯英文)输入法

打开设置&#xff0c;选择“时间和语言” 选择“语言和区域” 检查语言中否有英语&#xff08;美国&#xff09;&#xff0c;如果没有&#xff0c;请单击“添加语言” 单击英语&#xff08;美国&#xff09;右方的更多选项按钮&#xff0c;选择“语言选项” 找到下方“键盘…

对象数组变成一维数组,导出txt文件

假设对象数组格式为此 arr1: [{id: 1,title: 我是1目录,children: [{id: 11,title: 我是1-1目录,children: [{id: 111,title: 我是1-1-1目录,children: [],},],},],},{id: 2,title: 我是2目录,children: [{id: 21,title: 我是2-1目录,children: [],},],},], 页面如下 先在页面…

Kafka Connect: Debezium MySQL Connector 的 Partition 和 Replication 配置

使用 Kafka Connect 的 Debezium MySQL Connector 将 MySQL 数据库中的 CDC 数据写入 Kafka 时&#xff0c;在 Kafka 默认允许自动创建 Topic 的情况下&#xff0c;Kafka Connect 自动创建的 Topic 只有一个 Partition&#xff0c;在实际应用中&#xff0c;这显然是不行&#x…

gin中使用JWT

1.jwt使用 安装 go get github.com/golang-jwt/jwt/v4 默认Claim 如果我们直接使用JWT中默认的字段&#xff0c;没有其他定制化的需求则可以直接使用这个包中的和方法快速生成和解析token。 // 用于签名的字符串 var mySigningKey []byte("liwenzhou.com")// G…

【Spring 篇】MyBatis中的CRUD魔法:数据之美的四重奏

MyBatis&#xff0c;这个数据持久化的魔法师&#xff0c;以其优雅的SQL映射和简洁的配置文件&#xff0c;为我们呈现出一场CRUD&#xff08;Create, Read, Update, Delete&#xff09;的奇妙之旅。在这篇博客中&#xff0c;我们将深入探讨MyBatis中的增、删、改、查操作&#x…

溯流而上:从算盘到现代计算机——计算设备历史与关键人物的探索之旅

Tracing the Evolution: From Abacus to Modern Computers - An Exploratory Journey Through the History of Computing Devices and Key Figures 溯流而上&#xff1a;从算盘到现代计算机——计算设备历史与关键人物的探索之旅 Good day! Today, we embark on a fascinating …

linux基础学习(5):yum

yum是为了解决rpm包安装依赖性而产生的一种安装工具 1.yum源 1.1配置文件位置 yum源的配置文件在/etc/yum.repos.d/中 *Base源是网络yum源&#xff0c;也就是需要联网才能使用的yum源。默认情况下&#xff0c;系统会使用Base源 *Media源是光盘yum源&#xff0c;是本地yum源…

std::atomic

一、概述 std::atomic 是C11引入的一个模板类&#xff0c;用于提供原子操作的类型。在多线程编程中&#xff0c;当多个线程同时访问同一块数据时&#xff0c;可能会导致数据竞争和不确定的行为。std::atomic 可以用来创建原子类型的变量&#xff0c;保证对该变量的操作是原子的…

【leetcode】下一个排列 双指针算法

/*** param {number[]} nums* return {void} Do not return anything, modify nums in-place instead.*/ var nextPermutation function(nums) {const len nums.length;let i len -2;//找到第一个当前项比后一项小的位置iwhile(i>0&&nums[i]>nums[i1]) i--;if(…

(202401)深度强化学习基础2:策略梯度

文章目录 前言策略梯度1 基于价值算法的缺点2 策略梯度算法3 REINFORCE算法本章小结 前言 感谢Datawhale成员的开源本次学习内容的文档地址为 第九章 策略梯度 策略梯度 这个章节会开始介绍基于策略梯度的算法。前面的算法都是针对“奖励”或者说“回报&#xff08;reward&a…

章鱼网络 Community Call #17|打造全新 Omnity 跨链协议

香港时间2024年1月8日12点&#xff0c;章鱼网络举行第17期 Community Call。 对于 Octopus Community 而言&#xff0c;2023年是一个分水岭。我们如期兑现我们的承诺&#xff0c;成功上线了包括 $NEAR Restaking 和 Adaptive IBC 在内的完整的 Octopus 2.0。 自从我们在2023年…

9.2 工厂模式(❤)

9.2 工厂模式(❤) 1. 工厂模式介绍1.1 工厂模式1.2 简单工厂1.2.1 案例讲解: 购买电脑2. 工厂模式用途和特点3. 工厂模式项目应用1. 工厂模式介绍 1.1 工厂模式

HashMap原理

Java面试题 HashMap原理 HashMap是数组链表/红黑树结构&#xff0c;在put元素时会经过以下步骤&#xff1a; 1.先根据key的hashcode计算存储索引。 2.如果数组为空&#xff0c;则先执行resize进行扩容。 3.判断是否存在哈希冲突&#xff0c;如果没有则直接生成链表结构Node放入…

Java便捷访问的好处

便捷访问有以下几个好处&#xff1a; 提高效率&#xff1a;便捷访问可以减少查找和获取信息所需的时间和努力&#xff0c;从而提高工作和生活效率。 增强用户体验&#xff1a;提供便捷访问可以使用户感到方便和满意&#xff0c;从而增强他们对产品或服务的体验。 增加使用频率…