LeetCode 15 3Sum 解题思路和python代码

news2024/10/6 19:26:11

题目:
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
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.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2:

Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3:

Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.

Constraints:

3 <= nums.length <= 3000
-105 <= nums[i] <= 105

解题思路:
首先对数组进行排序,有助于使用双指针方法快速找到合适的三元组。
对于每个元素nums[i],将它作为第一个数,然后使用双指针方法在 i 之后的数组部分寻找另外两个数,使它们的和等于0。
左指针从 i+1 开始,右指针从数组末尾开始,逐步向中间收缩。根据三者之和的结果,调整左右指针的位置。
为了避免重复的三元组,遍历时需要跳过相同的元素。

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result = []
        nums.sort()

        print("nums: ", nums)

        for i in range(len(nums)):
            print("i: ", i)

            # 如果当前元素和前一个相同,跳过,避免重复三元组
            if i > 0 and nums[i] == nums[i-1]:
                continue
            
            left, right = i+1, len(nums)-1

            while left < right:
                print("nums[i]: ", nums[i])
                print("nums[left]: ", nums[left])
                print("nums[right]: ", nums[right])
                total = nums[i] + nums[left] + nums[right]
                print("total: ", total)

                if total == 0:
                    result.append([nums[i], nums[left], nums[right]])

                    while left < right and nums[left] == nums[left+1]:
                        left+=1
                    while left < right and nums[right] == nums[right-1]:
                        right-=1
                    
                    left+=1
                    right-=1
                
                elif total < 0:
                    left += 1
                else:
                    right -= 1
        
        return result

例子:
nums = [-1,0,1,2,-1,-4]

首先,对数组进行排序。
('nums: ', [-4, -1, -1, 0, 1, 2])

接着,遍历数组。
('i: ', 0)
('nums[i]: ', -4)
('nums[left]: ', -1)
('nums[right]: ', 2)
('total: ', -3)

和小于0,说明左指针太小,向右移动左指针。

('nums[i]: ', -4)
('nums[left]: ', -1)
('nums[right]: ', 2)
('total: ', -3)

和还是小于0,说明左指针太小,向右移动左指针。

('nums[i]: ', -4)
('nums[left]: ', 0)
('nums[right]: ', 2)
('total: ', -2)

和还是小于0,说明左指针太小,向右移动左指针。

('nums[i]: ', -4)
('nums[left]: ', 1)
('nums[right]: ', 2)
('total: ', -1)

和还是小于0,但 i=0 的遍历结束,进入 i=1。

('i: ', 1)
('nums[i]: ', -1)
('nums[left]: ', -1)
('nums[right]: ', 2)
('total: ', 0)

和等于0,将三元组加入result。检查左指针指向的数(-1)是否与下一个数(0)相等,如果相等,就要跳过重复的左指针元素;同样道理,检查右指针指向的数(2)是否与前一个数(1)相等,如果相等,就跳过重复的右指针元素。

移动指针后,继续计算和。
('nums[i]: ', -1)
('nums[left]: ', 0)
('nums[right]: ', 1)
('total: ', 0)

和等于0,将三元组加入result。

左指针大于右指针,遍历结束。

('i: ', 2)

nums[2]还是 -1,因此跳过。

('i: ', 3)
('nums[i]: ', 0)
('nums[left]: ', 1)
('nums[right]: ', 2)
('total: ', 3)

左指针大于右指针,遍历结束。

('i: ', 4)
左指针等于右指针,while loop不会开始。

('i: ', 5)
左指针大于右指针,while loop不会开始。

output是 [[-1,-1,2],[-1,0,1]]

time complexity是O(n^2)

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

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

相关文章

Python异常处理中的9个常见错误及其解决办法,建议收藏

在Python编程中&#xff0c;异常处理是确保程序健壮性和可靠性的重要部分。然而&#xff0c;在使用异常处理时&#xff0c;开发者可能会犯一些常见的错误。以下是9个常见的异常处理错误及其解决办法&#xff1a; 1. 语法错误 (SyntaxError) 语法错误是最常见的错误之一。它通…

知识竞赛活动直播应如何搞呢?流程是怎样的?

很多知识竞赛活动选择通过直播的方式进行传播。直播都为观众带来了更加便捷和丰富的观看体验。那么&#xff0c;知识竞赛活动直播流程究竟是怎样进行的呢&#xff1f; 1、前期筹备 在知识竞赛活动开始之前&#xff0c;策划团队需要对整个直播过程进行详细的规划和筹备。 这包…

选择最佳HR系统_6款产品评测与推荐

本文盘点了ZohoPeople、SAPSuccessFactors等六款主流HRMS&#xff0c;各系统各具特色&#xff0c;如ZohoPeople的全球化云管理、SAP的高定制化、Workday的实时数据分析等&#xff0c;适合不同规模企业需求&#xff0c;建议企业试用后决策。 一、Zoho People Zoho People 是一个…

海贝音乐 4.3.1 完全免费,手机本地无损,支持在线获取歌词和封面

海贝音乐是一款专为HiFi用户设计的本地音乐播放器&#xff0c;支持在线获取封面和歌词&#xff0c;支持均衡器&#xff0c;完全免费&#xff0c;界面优美&#xff0c;无任何广告。 大小&#xff1a;43M 百度网盘&#xff1a;https://pan.baidu.com/s/1efDXtD62hoxVxx3R9ENwDA?…

DNABERT: 一个基于 Transformer 双向编码器表征的预训练 DNA 语言模型

本文结合 DNABERT 的原文&#xff0c;主要介绍了&#xff1a; Overview of DNABERT 开发 DNABERT 的背景 DNABERT 的 tokenization DNABERT 的模型架构 DNABERT 的预训练 基于微调 DNABERT 的应用 1. Overview of DNABERT 我们之前介绍了 BERT&#xff0c;它是一个基于 Transfo…

【ssh-xorg】SSH远程配置X11窗口回传

前言 我们通常在进行远程配置板端的时候往往会出现一个问题&#xff0c;在不连接显示屏或者启用VNC服务的前提下(或者使用其他软件提供的功能)&#xff0c;我们无法在远程终端看到板端的新窗口&#xff0c;本文提供一种方式&#xff0c;在进行ssh远程连接时候制定参数-CX&…

SpringIoC容器的初识

一、SpringIoC容器的介绍 Spring IoC 容器&#xff0c;负责实例化、配置和组装 bean&#xff08;组件&#xff09;。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这…

Vueron引领未来出行:2026年ADAS激光雷达解决方案上市路线图深度剖析

Vueron ADAS激光雷达解决方案路线图分析&#xff1a;2026年上市展望 Vueron近期发布的ADAS激光雷达解决方案路线图&#xff0c;标志着该公司在自动驾驶技术领域迈出了重要一步。该路线图以2026年上市为目标&#xff0c;彰显了Vueron对未来市场趋势的精准把握和对技术创新的坚定…

如何实现 C/C++ 与 Python 的通信?

在现代编程中&#xff0c;C/C与Python的通信已经成为一种趋势&#xff0c;尤其是在需要高性能和灵活性的场景中。本文将深入探讨如何实现这两者之间的互通&#xff0c;包括基础和高级方法&#xff0c;帮助大家在混合编程中游刃有余。 C/C 调用 Python&#xff08;基础篇&#…

AI 时代:产品经理不“AI”就出局?

即便你没想去做“AI 产品经理”&#xff0c;那你也不能成为一个不会用 AI 的产品经理。 产品经理肯定是所有互联网从业者中&#xff0c;最先捕捉到 AI 趋势的岗位。 但只知道 AI、关注 AI 还不够&#xff0c;仔细审视一下&#xff1a;你自己的工作&#xff0c;被 AI 提效了么…

打造自己的RAG解析大模型:Windows部署OCR服务(可商业应用)

在上一篇文章中&#xff0c;我们介绍了如何在 Windows 环境中配置 OCR 相关模型&#xff0c;并完成了模型验证。本篇文章将基于之前的内容&#xff0c;进一步讲解如何将文本检测、方向分类和文本识别模型进行串联&#xff0c;最终搭建一个基础的 OCR 应用服务。通过这些模型的串…

wxml语法-声明和绑定数据

文章目录 1、展示内容1.1、{{school}} 直接引用的是一个字符串或其他类型的简单值1.1.1、index.wxml1.1.2、index.js 1.2、{{obj.name}} 引用的是一个对象中的特定属性值1.2.1、index.wxml1.2.2、index.js 2、绑定属性值2.1、使用数据绑定的方式来动态设置元素的属性值2.1.1、i…

冯诺依曼体系|操作系统

目录 一、硬件&#xff1a;冯诺依曼体系 1.冯诺依曼体系结构 2.冯诺依曼体系结构组成 3.内存的重要性 &#xff08;1&#xff09;提升运行速度 &#xff08;2&#xff09;提升运行效率 二、软件&#xff1a;操作系统 1.什么是操作系统 &#xff08;1&#xff09;内部理…

代码随想录Day54

今天是国庆假期后的恢复做题的第一天&#xff0c;摆了那么久感觉还是有点没摆够哈哈哈哈&#xff01;今天两道题都是困难题&#xff0c;两道题都去看讲解了&#xff0c;感觉这两道题是高度相似的&#xff0c;接雨水用单调递增栈来做&#xff0c;柱状图中最大的矩形用单调递减栈…

水凝胶发生器,不对称设计妙,医电应用前景广

大家好&#xff01;今天来了解一种具有工程机械离子不对称性的水凝胶发生器——《A high-current hydrogel generator with engineered mechanoionic asymmetry》发表于《Nature Communications》。嘿&#xff01;你能想象一种材料&#xff0c;它能像魔法一样在低频运动下产生高…

消息称苹果iPhone系列将完全放弃LCD屏幕

近日&#xff0c;据日经亚洲消息&#xff0c;苹果公司将于明年初推出搭载OLED显示屏的 iPhone SE 4&#xff0c;标志其整个iPhone系列已进入从 LCD 过渡到 OLED 技术的最后阶段&#xff0c;2025年及之后销售的所有iPhone机型均将搭载OLED屏幕。 由此&#xff0c;两家日本面板供…

【一起学NLP】Chapter3-使用神经网络解决问题

目录 使用神经网络解决问题Tip:数据集划分学习使用的代码Tip:epochTip:数据打乱Trainer类Tip-高速化计算 使用神经网络解决问题 import sys sys.path.append(..) # 为了引入父目录的文件而进行的设定 from dataset import spiral import matplotlib.pyplot as pltx,t spiral.…

解决银河麒麟桌面操作系统V10(ARM)中`apt-get update`“正在等待报头”问题

解决银河麒麟桌面操作系统V10&#xff08;ARM&#xff09;中apt-get update“正在等待报头”问题 1、问题描述2、 解决方法步骤一&#xff1a;打开终端步骤二&#xff1a;清理APT缓存步骤三&#xff1a;再次尝试更新软件源 &#x1f496;The Begin&#x1f496;点点关注&#x…

利士策分享,故事创作和造谣及假新闻之间如何界定?

利士策分享&#xff0c;故事创作和造谣及假新闻之间如何界定&#xff1f; 在这个信息爆炸的时代&#xff0c;一篇打着“人民网”旗号的虚假文章《低俗炒作博眼球&#xff0c;曝"瓜"文化不可取》在网络上迅速发酵&#xff0c;不仅误导了公众&#xff0c;更对无辜者造…

【源码+文档】基于SpringBoot+Vue校园智慧迎新服务平台

&#x1f6a9;如何选题&#xff1f; 如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;这些问题是需要大家在选题前需要考虑的&#xff0c;具体的方法我会在文末详细为你解答。 &#x1f6ad;如何快速熟悉一个项目…