美文网首页
leetcode 中快慢指针的应用

leetcode 中快慢指针的应用

作者: ltochange | 来源:发表于2021-08-08 18:48 被阅读0次

快慢指针的在leetcode的问题中有很多应用,例如通过一次遍历找到链表的中间节点。 这里要介绍的是作为哨兵,应用于数组或者链表中删除特定元素,不另外开辟空间,即空间复杂度为O(1)

删除有序数组中的重复项

leetcode 26

在这里插入图片描述
在这里插入图片描述
因为是有序数组,所以重复的元素都是在一起的。暴力处理,每次判断当前元素和后一个元素是否相同,不相同则删除,而删除需要移动后面的元素,时间复杂度为O(n^2)

使用快慢指针,slow记录的是不同元素的索引。fast作为哨兵,一开始指向slow的下一个元素,如果遇到不同的元素则赋值给slow, 最后返回数组的长度为slow + 1(索引从0开始,长度需要+1)。 此时数组中的前 slow + 1个元素都有不同的值。

代码如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        slow = 0
        nums_len = len(nums)
        for fast in range(1,nums_len):
            if nums[fast] != nums[slow]:
                slow += 1
                nums[slow] = nums[fast]
        return slow + 1

时间复杂度为:O(n)
空间复杂第为: O(1)

删除排序链表中的重复元素

leetcode 83

在这里插入图片描述
在这里插入图片描述

方法和上一题一样,这里需要注意,链表需要将slow的下一个节点置为None

代码如下:

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not  head:
            return None
        slow,fast = head,head
        while fast.next:
            fast = fast.next
            if fast.val != slow.val:
                slow = slow.next
                slow.val = fast.val
        slow.next = None
        return head

时间复杂度为:O(n)
空间复杂第为: O(1)

移除特定元素

letcode 27

在这里插入图片描述
在这里插入图片描述
同样利用使用快慢指针。

slow初始值为-1,不指向任何元素,因为有可能整个数组都是待删除的元素fast作为哨兵,从头遍历。如果遇到不等于val的元素则赋值给slow, 最后返回数组的长度为slow + 1

代码如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        if len(nums)  == 0:
            return 0
        nums_len = len(nums)
        slow = -1  # 
        for fast in range(nums_len):
            if nums[fast] != val:
                slow += 1
                nums[slow] = nums[fast]
        return slow + 1

时间复杂度为:O(n)
空间复杂第为: O(1)

移动零

letcode 283

在这里插入图片描述

思路于上面一个问题一样,只不过这里不是移除元素0,而是要将元素0移至末尾,因此这里要进行元素的交换,而不是直接赋值

代码如下:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums)==0:
            return
        slow = -1
        nums_len = len(nums)
        for fast in range(nums_len):
            if nums[fast] != 0:
                slow += 1
                # 进行元素的交换,而不是直接赋值
                tmp = nums[slow]
                nums[slow] = nums[fast]
                nums[fast] = tmp

时间复杂度为:O(n)
空间复杂第为: O(1)

相关文章

  • leetcode 中快慢指针的应用

    快慢指针的在leetcode的问题中有很多应用,例如通过一次遍历找到链表的中间节点。 这里要介绍的是作为哨兵,应用...

  • 快慢指针的应用

    快慢指针 快慢指针中的快慢指的是移动的步长,快慢分别指的是快指针每次移动两步,满指针每次移动一步 快慢指针的应用 ...

  • 快慢指针的应用

    --- 最近在刷LeetCode时,发现快慢指针在链表和查找算法中应用非常广泛,对于很多即将面试或者学习算法的同学...

  • [leetcode]浅谈快慢指针在算法中的应用

    天下武功, 无坚不破, 唯快不破 ——— 某大佬 本文为我,leetcode easy player,algori...

  • 快慢指针 02

    快慢指针 02 https://leetcode-cn.com/problems/linked-list-cycl...

  • 快慢指针 01

    快慢指针 01 https://leetcode-cn.com/problems/linked-list-cycl...

  • 快慢指针 03

    快慢指针 03 https://leetcode-cn.com/problems/remove-nth-node-...

  • 算法——数组常见初级题(JS)

    一、解法:双指针——快慢指针 Leetcode 26 删除排序数组中的重复项解题思路:两个指针都指向数组的一个数,...

  • 快慢指针的应用

    快慢指针的快慢主要是指在遍历链表过程中指针移动速度的快慢。比如遍历单链表,我们可以让指针每次移动一个节点,也可以让...

  • 快慢指针的应用

    什么是快慢指针:快慢指针是链表操作中的常用操作,最经典的应用是判断单链表中是否有环。 判断单链表是否存在环 两个指...

网友评论

      本文标题:leetcode 中快慢指针的应用

      本文链接:https://www.haomeiwen.com/subject/levovltx.html