双指针算法,python求解给定数组的三数之和问题

news/2024/7/23 14:08:15 标签: 算法, python, 数据结构

对于双指针算法,一般是用于解决对数组等数据结构进行遍历的问题的一种编程思路,其主要是使用两个指针共同配合工作,对数组等数据结构进行搜索并返回得到想要搜索的结果,针对给定问题,三数之和问题,这是一个双指针算法中的经典问题,而且使用的是双指针算法中的一个类型,也就是左右双指针算法,这个问题主要是以三个数为限制条件,对左右两个指针进行调整。如下如问题的描述:

给定包含有n个整数的数组,对这个数组中的元素进行判断,是否存在有三个元素,可以使得这三个元素的和为0,需要得到的是一个列表,列表元素是符合条件的三个数的元组,并且这个列表中不存在重复元素。

添加图片注释,不超过 140 字(可选)

对于这个问题的求解,大部分人直接使用暴力求解,也是可以快速得到问题的解的,这里大致说一下暴力求解的问思路,可以使用三个循环和一个判断就可以,三个循环进行嵌套,对给定数组直接进行遍历,每一层循环代表的是对列表查找组成元组的三个元素,最后一个判断就是判断三个数的和为0并且与最终结果列表中的元素不重复,以下是使用python暴力求解的代码:

def threeSum(self, array):
    array.sort()
    length=len(array)
    res=[]
    for i in range(length):#三层循环
        for j in range (i+1,length):
            for k in range(j+1,length):
                if array[i]+array[k]+array[j]==0 and not [array[i],array[j],array[k]] in res:
                    res.append([array[i],array[j],array[k]])
    return res

对于暴力求解,其在给定数组的元素较少的情况下,还可以采用,但是在数据量增大的情况,时间复杂度本身就很高,将会大大的降低效率,不适合使用。

添加图片注释,不超过 140 字(可选)

而在使用左右双指针算法的方法中,其思路是对于三数之和为零,其实是可以看做前两个数的和等于最后一个数的负数(问题条件中给定的数据都是正整数),在求和之前可以先将数组直接进行排序,这样就可以降低复杂度,避免了每一次的遍历,在已经进行了排序的前提下,对数组只遍历一遍,将每一个遍历过的元素都当做最后一个负数的元素,然后在遍历过程中使用左右双指针来分别指向当前元素的下一个元素以及数组的最后一个元素。在指针移动过程中,只要左指针小于右指针,则就计算三数之和来决定左右指针是否应该移动,而且在移动的过程中就可以判断是否是重复元素,如果是重复元素,跳过即可。

添加图片注释,不超过 140 字(可选)

如下是使用左右双指针算法求解三数之和的代码:

def threeSum(self, array):
    array.sort()
    res= []
    for k in range(len(array) - 2):
        if array[k] > 0: break
        if k > 0 and array[k] == array[k - 1]: continue 
        l, r= k + 1, len(array) - 1
        while l < r:
            s = array[k] + array[l] + array[r]
            if s < 0:
                l += 1
                while l < r and array[l] == array[l - 1]: l += 1#进行元素去重
            elif s > 0:
                r -= 1
                while l < r and array[r] == array[r + 1]: r -= 1
            else:
                res.append([array[k], array[l], array[r]])
                l += 1
                r -= 1
                while l < r and array[l] == array[l - 1]: l += 1
                while l < r and array[r] == array[r + 1]: r -= 1
    return res

http://www.niftyadmin.cn/n/5310035.html

相关文章

分布式(5)

目录 22.什么是Paxos算法&#xff1f;如何实现&#xff1f; 24.全局唯一ID有哪些实现方案&#xff1f; 25.数据库方式实现方案&#xff1f;有什么缺陷&#xff1f; 22.什么是Paxos算法&#xff1f;如何实现&#xff1f; Paxos算法是Lamport宗师提出的一种基于消息传递的分布…

Linux 常见服务配置

笔记所以内容很多&#xff0c;建议选择性看看 SSH Secure Shell 用于与服务器建立安全的连接 对应服务 sshd 注意&#xff1a;配置文件 配制文件修改需要重启或重载sshd服务才能生效 systemctl sshd reload # 重载 sshd 配置文件 systemctl sshd restart # 重启 ssh…

CoTracker 环境配置与ORB 特征点提取结合实现视频特征点追踪

CoTracker 环境配置&与ORB 特征点提取结合实现视频特征点追踪 文章目录 CoTracker 环境配置&与ORB 特征点提取结合实现视频特征点追踪Step1&#xff1a;配置 CoTracker 环境Step2&#xff1a;运行官方的例程Step3&#xff1a;结合 ORB 特征点提取结果展示&#xff1a; …

Mysql常见的等保处理

一、设置登陆失败处理 需求&#xff1a; 如果连续5次输入密码错误&#xff0c;限制登录数据库30分钟 解决方案&#xff1a; 使用Mysql自带插件 (CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS ) 1、运行命令&#xff0c;安装插件 install plugin CONNECTIO…

LeetCode 2125. 银行中的激光束数量【数组,遍历】1280

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

MySQL复习汇总(图书管理系统)

MySQL图书管理系统&#xff08;49-94&#xff09;源码_71.备份book数据库到e盘的mybook.sql文件(备份文件中要求包含建库命令)-CSDN博客 -- 1、 创建一个名称为book的数据库。 -- 2、 打开book数据库 -- 3、 创建数据表分别如下&#xff08;除外键之外&#xff09;…

C# WinForm MessageBox自定义按键文本 COM组件版

c# 更改弹窗MessageBox按钮文字_c# messagebox.show 字体-CSDN博客 需要用到大佬上传到百度云盘的Hook类&#xff0c;在大佬给的例子的基础上改动了点。 应用时自己加GUID和ProgID。 组件实现&#xff1a; using System; using System.Collections.Generic; using System.L…

数据密集型应用系统设计--第2章 数据模型与查询语言

一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是&#xff1a;如何将其用下一层来表示&#xff1f; 1.作为一名应用程序开发人员&#xff0c;观测现实…