我对双指针算法认知

简介: 我对双指针算法认知



双指针算法是一种常用于解决数组或链表中的问题的算法思想。它的基本思想是使用两个指针在数组或链表中相互协作,以解决问题。双指针算法通常分为两种类型:快慢指针和左右指针。下面分别详细讲解这两种双指针算法。

1. 快慢指针

基本思想:

快慢指针算法主要用于解决链表中的问题,如判断链表是否有环,找到链表的中间节点等。它的基本思想是维护两个指针,一个移动速度快(快指针),一个移动速度慢(慢指针)。通过不同的步长移动,来判断链表的性质。

示例问题:判断链表是否有环
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def hasCycle(head: ListNode) -> bool:
    slow = head
    fast = head
    
    while fast is not None and fast.next is not None:
        slow = slow.next
        fast = fast.next.next
        
        if slow == fast:
            return True
    
    return False

在这个例子中,如果链表中有环,快指针最终会追上慢指针,从而返回True;如果链表中没有环,快指针会提前到达链表尾部,返回False。

2. 左右指针

基本思想:

左右指针算法主要用于解决数组中的问题,如两数之和,反转数组等。它的基本思想是维护两个指针,一个在数组的左侧,一个在数组的右侧,通过不同的移动条件,来解决问题。

示例问题:反转数组
def reverseArray(nums):
    left, right = 0, len(nums) - 1
    
    while left < right:
        # 交换左右指针指向的元素
        nums[left], nums[right] = nums[right], nums[left]
        # 移动指针
        left += 1
        right -= 1

在这个例子中,通过左右指针不断交换对应位置的元素,从而实现数组的反转。

总结:

双指针算法是一种高效解决特定问题的方法,通过维护两个指针在数组或链表中移动,可以降低时间复杂度。在解决问题时,可以根据具体情况选择快慢指针或左右指针的方式,并注意终止条件和指针的移动规则。这种算法思想在解决链表、数组等问题时都有广泛的应用。


相关文章
|
5月前
|
算法
双指针算法
双指针算法
31 2
|
2月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
61 4
双指针算法详解
|
5月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
1月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
3月前
|
算法 容器
【算法】双指针
【算法】双指针
|
3月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
6月前
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
5月前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和