第三章 双指针 Two Pointers

文章介绍了使用双指针解决滑动窗口问题的常见模板,包括相向、背向和同向双指针方法,并强调了时间复杂度为O(n)以及原地操作的要求,不允许使用额外空间。同时,内容涵盖了子数组和子字符串的处理,以及回文判断的场景。
摘要由CSDN通过智能技术生成

使用条件

  • 滑动窗口(90%)

  • 时间复杂度要求 �(�)O(n) (80%是双指针)

  • 要求原地操作,只可以使用交换,不能使用额外空间(80%)

  • 有子数组 subarray / 子字符串 substring 的关键词(50%)

  • 有回文 Palindrome 关键词(50%)

复杂度

  • 时间复杂度:O(n)

    • 时间复杂度与最内层循环主体的执行次数有关

    • 与有多少重循环无关

  • 空间复杂度:O(1)

    • 只需要分配两个指针的额外内存

模板:

# 相向双指针(patition in quicksort)
def patition(self, A, start, end):
    if start >= end:
        return
    left, right = start, end
    # key point 1: pivot is the value, not the index
    pivot = A[(start + end) // 2]
    # key point 2: every time you compare left & right, it should be
    # left <= right not left < right
    while left <= right:
        while left <= right and A[left] < pivot:
            left += 1
        while left <= right and A[right] > pivot:
            right -= 1
        if left <= right:
            A[left], A[right] = A[right], A[left]
            left += 1
            right -= 1

# # 背向双指针
# left = position
# right = position + 1
# while left >= 0 and right < len(s):
#    if left 和 right 可以停下来了:
#         break
#     left -= 1
#     right += 1
# # 同向双指针
# j = 0
# for i in range(n):
#     # 不满足则循环到满足搭配为止
#     while j < n and i 到 j 之间不满足条件:
#         j += 1
#     if i 到 j 之间满足条件:
#         处理 i 到 j 这段区间

# # 合并双指针
# def merge(list1, list2):
#     new_list = []
#     i, j = 0, 0
#     # 合并的过程只能操作 i, j 的移动,不要去用 list1.pop(0) 之类的操作
#     # 因为 pop(0) 是 O(n) 的时间复杂度
#     while i < len(list1) and j < len(list2):
#         if list1[i] < list2[j]:
#             new_list.append(list1[i])
#             i += 1
#         else:
#             new_list.append(list2[j])
#             j += 1
#     # 合并剩下的数到 new_list 里
#     # 不要用 new_list.extend(list1[i:]) 之类的方法
#     # 因为 list1[i:] 会产生额外空间耗费
#     while i < len(list1):
#         new_list.append(list1[i])
#         i += 1
#     while j < len(list2):
#         new_list.append(list2[j])
#         j += 1
#     return new_list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值