双指针

双指针

引入

双指针是一种简单而又灵活的技巧和思想 ,单独使用可以轻松解决特定问题,和其他算法结合也能发挥多样的用途。

双指针顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息。

维护区间信息

如果不和其他数据结构结合使用,双指针维护区间信息的最简单模式就是维护具有一定单调性,新增和删去一个元素都很方便处理的信息,就比如正数的和、正整数的积等等。

例题1

713. 乘积小于 K 的子数组 - 力扣(LeetCode)

给定一个长度为 \(n\) 的正整数数组 \(nums\) 和整数 \(k\) ,找出该数组内乘积小于 \(k\) 的连续子数组的个数。

过程

设两个指针分别为 \(l,r\) ,另外一个变量 \(tmp\) 记录 \([l,r]\) 内所有数的乘积。最开始 \(l,r\) 都在最左面,先向右移动 \(r\) ,直到第一次发现 \(tmp \geq k\) ,这时就固定 \(r\) ,右移 \(l\) ,直到