我对双指针算法认知

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

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

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

总结:

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

 

你可能感兴趣的:(数据结构,算法)