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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: