leetcode刷题——双指针(快慢指针)

包含几道leetcode题目:

  • 141 判断列表是否存在环(easy)
  • 283 移动零(easy)
  • 27 移除元素(easy)
  • 26 删除排序数组中的重复项(easy)
  • 80 删除排序数组中的重复项 II(medium)

141. 判断列表是否存在环

解法: 快慢指针

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head or head.next == None:
            return False
        slow, faster = head, head.next
        while slow and faster:
            if slow == faster: return True
            slow = slow.next
            if faster.next: faster = faster.next.next
            else: return False
        return False

此题也可使用hash表,建立一个hash表存储访问过的节点,当出现重复访问的节点,说明出现环

283. 移动零(easy)

题目链接:https://leetcode-cn.com/problems/move-zeroes/

解法: 快慢指针

利用快慢指针,慢指针指向零元素,快指针指向非零元素,将快慢指针对应的元素交换

1. 定义快慢指针
2. 如果慢指针指向非零元素,慢指针后移,快指针后移
3. 如果慢指针指向零元素,快指针指向非零元素,二者交换,快慢指针均后移
4. 如果慢指针指向零, 快指针指向零元素, 快指针后移
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        slower, faster = 0, 0 #快指针指向不为零的元素,慢指针指向零元素,满足条件就交换
        while faster < len(nums):
            if nums[slower] != 0:
                slower += 1
            elif nums[faster] != 0:
                nums[slower],  nums[faster] = nums[faster], nums[slower]
                slower += 1
            faster += 1

27. 移除元素(easy)

题目链接:https://leetcode-cn.com/problems/remove-element/

解法:快慢指针

### 类似于上一题将等于val的元素移动至末尾
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        if not nums: return 0
        slower, faster = 0, 0
        while faster < len(nums):
            if nums[slower] != val: slower += 1
            elif nums[faster] != val: 
                nums[slower], nums[faster] = nums[faster], nums[slower]
                slower += 1
            faster += 1
        return slower        
## 由于本题要求直接删除元素,不需要像移动零元素那样,直接覆盖即可
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        if not nums: return 0
        slower, faster = 0, 0
        while faster < len(nums):
            nums[slower] = nums[faster]
            if nums[slower] == val: 
                faster += 1
                continue
            slower += 1
            faster += 1
        return slower

26. 删除排序数组中的重复项(easy)

题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

解法: 快慢指针

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not  nums: return 0
        # 慢指针指向待写入元素的位置,快指针遍历数组
        slower, faster = 0, 0
        while faster< len(nums):
        #当快指针指向的元素与慢指针不同时,说明相同的元素已经遍历结束,此时将慢指针后移,将快指针的元素写入慢指针位置,保留一个元素
            if nums[slower] != nums[faster]:
                slower += 1
                nums[slower] = nums[faster]
            faster += 1
        return slower + 1

80. 删除排序数组中的重复项 II(medium)

题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

解法:快慢指针

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums: return 0
        flag = True
        slower, faster = 0, 1
        while faster 

跳转至标签分类页

你可能感兴趣的:(leetcode刷题)