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小白入门——简单题目八题合集,每题两解

LeetCode小白入门——简单题目八题合集,每题两解

1. 两数之和---双指针篇七

LeetCode - 143 - 重排链表 - Java - 两种解法 - 细致

LeetCode JavaScript实现 回文链表(回文字符串) 题型汇总(双指针解法)

LeetCode题解61_旋转链表(Rotate-List)