算法-双指针 快慢指针

双指针:

不同的状态,导致不同指针的移动。最终的状态由于两个指针的位置决定。

 

经典题目:

1. 盛最多水的容器

问题抽象,容量:

min(l, r) * t。

容量取决于最小的一块木板,并且和木板之间的距离有关。

另双指针在容器的各自最远端。双指针开始向内移动,最大的容量必定在向内移动的过程中产生。

因为向内移动必定减小t,此时向内移动的最优方向必定以去掉较小的一块木板决定。

因此往min(l, r)方向移动一次。

时间复杂度O(N)

 

2. 所有三数之和或者两数之和。

问题在于找到**所有**符合的元素。

如果只找一个,哈希表可以O(n)。

找到所有,先排序O(nlogn),再双指针O(n)。

三数之和的时间复杂度为O(n*n)

 

3. 删除链表的倒数第N个节点

双指针,前指针比后指针向前N个节点,这样前指针到达末尾,后指针到达倒数第N个节点。

 

3. 环形链表 + 链表相交

快慢指针,数学计算经过的路径长度。

环形链表是相交后,slow指针再返回起点。再次相交处,就是环形入点

相交链表是遇到末尾后,A指针指向B起点,B指针指向A起点。 [再次]相交处,就是相交点。(或者不相交,就是都是Null,返回null)

 

posted @ 2021-08-29 21:44  xuyv  阅读(55)  评论(0编辑  收藏  举报