Python技巧之双指针

2023-12-03 23:50
文章标签 python 指针 技巧 之双

本文主要是介绍Python技巧之双指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 引言

最近业余刷了一些leetcode上的题目,遇到好多可以用双指针技术来快速解决的题目。这里对双指针技术做个归纳,方便后续查漏补缺。

闲话少说,我们直接开始吧!

2. 双指针的引入

双指针技术是一种允许我们通过利用一些排序数据来优化算法运行时间和空间效率的技术。它通常应用于数组和链表。
该技术可以归纳为以下三个步骤:

  • 初始化:初始状态下我们的指针可以在任何位置,这主要取决于我们需要达到的目标。
  • 移动:这一步决定我们如何向解决方案靠拢。通常情况下双指针可以沿同一方向或相反方向移动。
  • 终止条件:这决定了我们何时停止指针的移动。

为了加深大家的理解,这里我们来看几个具体的例子吧!

3. 判断回文字符串

题目描述:

给我们一个字符串作为输入,如果该字符串是回文字符串,则返回true,否则返回false。回文是一个单词、数字、短语或其他字符序列,其前后读音相同。

解决方案:

def isPalindrome(str):i = 0j = len(str) -1while i<j:if str[i] != str[j]:return Falsei += 1j -= 1return True

我们使用了双指针的思想解决了上述问题,上述三个步骤如下:

  • 初始化:在前2行中,我们定义了两个指针的初始位置,其中i在开头,j在结尾。
  • 移动:在第6行和第7行中,我们的两个指针将朝相反的方向移动,第一个指针i朝前移动,第二个指针j朝相反的方向移动。
  • 终止条件:当i>j时,遍历将停止,因为当i递增,j递减时,i从起始处开始,j在结束处,在数组的中间位置时,i将大于j,此时遍历结束。

4. 链表中的中间元素

题目描述:

给定单链表的头指针,返回该链表的中间节点。

4.1 暴力解决方案

链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。

代码如下:

def middleNode(self, head: ListNode) -> ListNode:A = [head]while A[-1].next:A.append(A[-1].next)return A[len(A) // 2]

复杂度分析:

  • 时间复杂度:O(N),其中 NN 是给定链表中的结点数目。
  • 空间复杂度:O(N),即数组 A 用去的空间。

4.2 快慢指针解决方案

解题思路:
我们可以使用两个指针slow fast 一起来遍历链表。其中slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间位置。
代码如下:

def middleNode(self, head: ListNode) -> ListNode:slow = fast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextreturn slow

上述代码中,使用了往同一个方向移动的两个指针,同样涉及三个通用步骤。如下:

  • 初始化:两个指针将从同一位置开始,即链表的开头。
  • 移动:它们将朝着相同的方向移动,但第二个比第一个快。
  • 终止条件:当移动更快的指针到达链表的末尾时,遍历将停止。由于更快的指针的移动速度是慢指针的两倍,当它到达末端时,慢指针将位于中间。

具体过程,图示如下:

在这里插入图片描述
复杂度分析

时间复杂度:O(N),其中 N 是给定链表的结点数目。

空间复杂度:O(1),只需要常数空间存放 slow fast 两个指针。

5. 总结

双指针技术可以帮助大家减少算法的运行时间,我们可以将其与数组和链表一起使用。指针不一定从同一位置开始,也不一定朝同一方向移动,停止条件需要根据查找的内容来进行定义。

嗯捏,就酱~

在这里插入图片描述

这篇关于Python技巧之双指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451330

相关文章

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.