LeetCode的双指针解法合集(python)
Posted 归止于飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode的双指针解法合集(python)相关的知识,希望对你有一定的参考价值。
文章简述
笔者刚刚开始刷力扣,才刷了二十来道,便发现许多利用双指针解题的题目,于是便想一次性小结一下,便于发现异同,熟悉此类解法。
LeetCode26——删除有序数组的重复项
思路:题目有要求必须原地删除,切要求O(1)的额外空间,所以我们需要在原数组上进行处理。此时设有两个快慢两个指针,当快指针遇到的值与上一个值不相同时,即与slow交换值,最后将slow值进行输出即所有不重复的值。
(建议看力扣的动画题解,方便理解)
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
fast = slow = 1
while fast < n:
if nums[fast] != nums[fast-1]:
nums[slow] = nums[fast]
slow = slow + 1
fast = fast+1
return slow
LeetCode27——移除元素
在fast进行遍历时,将不是nums的值用slow进行统计,最后输出slow,做到删除的效果。所以此时fast为辅助指针,由于遍历原数组。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = slow = 0
n = len(nums)
while fast < n:
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
LeetCode160——相交链表
思路;据说这是一道很浪漫的双指针题,当然也可以利用哈希表进行求解。这里两个指针严格来说是平等的关系,它们“步频”是一致的,如果两链表相交,它们的交点后半部分是一样的,进行了交换后,它们总能在交点相聚。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
pa,pb = headA,headB
while pa != pb:
pa = pa.next if pa else headB
pb = pb.next if pb else headA
return pa
LeetCode141——环形指针
思路;如果一个链表存在环,两个步频不一样的指针在环中终究会相遇。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if head == None or head.next == None:
return False
h1,h2 = head,head
while h2 and h2.next:
h1 = h1.next
h2 = h2.next.next
if h1 == h2:
return True
return False
小结
面对许多链表,数组类题,都可以尝试双指针法。我们需要搞清两个指针的区别,作用。哪个指针应该是最后输出的,哪个是辅助指针。有了主次关系后,编程才能更有编辑,解题才方便下手。
以上是关于LeetCode的双指针解法合集(python)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode - 143 - 重排链表 - Java - 两种解法 - 细致