我对双指针算法认知

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



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

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

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

总结:

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


相关文章
|
9天前
|
算法
双指针算法
双指针算法
9 2
|
25天前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
1月前
|
算法
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
|
1月前
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
1月前
|
算法
[优选算法]——双指针——Leetcode——1089. 复写零
[优选算法]——双指针——Leetcode——1089. 复写零
|
15天前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
1月前
|
存储 算法 容器
算法:双指针
算法:双指针
25 3
|
1月前
|
算法 C++
【优选算法】——双指针——18. 四数之和
【优选算法】——双指针——18. 四数之和
|
1月前
|
算法
【优选算法】——双指针——Leetcode——283.移动零
【优选算法】——双指针——Leetcode——283.移动零
|
1月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)