最近业余刷了一些leetcode
上的题目,遇到好多可以用双指针技术来快速解决的题目。这里对双指针技术做个归纳,方便后续查漏补缺。
闲话少说,我们直接开始吧!
双指针技术是一种允许我们通过利用一些排序数据来优化算法运行时间和空间效率的技术。它通常应用于数组和链表。
该技术可以归纳为以下三个步骤:
为了加深大家的理解,这里我们来看几个具体的例子吧!
题目描述:
给我们一个字符串作为输入,如果该字符串是回文字符串,则返回true,否则返回false。回文是一个单词、数字、短语或其他字符序列,其前后读音相同。
解决方案:
def isPalindrome(str):i = 0j = len(str) -1while i<j:if str[i] != str[j]:return Falsei += 1j -= 1return True
我们使用了双指针的思想解决了上述问题,上述三个步骤如下:
i
在开头,j
在结尾。i
朝前移动,第二个指针j
朝相反的方向移动。i>j
时,遍历将停止,因为当i
递增,j
递减时,i
从起始处开始,j
在结束处,在数组的中间位置时,i
将大于j
,此时遍历结束。题目描述:
给定单链表的头指针,返回该链表的中间节点。
链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 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]
复杂度分析:
解题思路:
我们可以使用两个指针slow
与 fast
一起来遍历链表。其中slow
一次走一步,fast
一次走两步。那么当 fast
到达链表的末尾时,slow
必然位于中间位置。
代码如下:
def middleNode(self, head: ListNode) -> ListNode:slow = fast = headwhile fast :slow = fast = turn slow
上述代码中,使用了往同一个方向移动的两个指针,同样涉及三个通用步骤。如下:
具体过程,图示如下:
复杂度分析
时间复杂度:O(N),其中 N 是给定链表的结点数目。
空间复杂度:O(1),只需要常数空间存放 slow
和 fast
两个指针。
双指针技术可以帮助大家减少算法的运行时间,我们可以将其与数组和链表一起使用。指针不一定从同一位置开始,也不一定朝同一方向移动,停止条件需要根据查找的内容来进行定义。
嗯捏,就酱~
本文发布于:2024-02-04 19:45:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170715076758971.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |