
一、前言
在本文会为大家带来算法中有关双指针的讲解。
二、正文
1. 算法介绍
什么是双指针? 从字面上来看是不是就是利用两个指针来进行题目的解答?但是首先我们要明确的一点是虽然这个算法的名称叫做双指针,但还是其在实际操作的时候并不一定是实例化出两个指针在进行操作,有可能是数组的下标,又或者是根据我们的想象定义出来的两个变量。所以这里的'指针'实际是非常灵活的,本质是一种变量,可以是指针,也可以是数组下标。
2. 算法优点
双指针有什么优点? 既然双指针本质上是一种变量,无非数量为两个罢了,为啥会被列入算法之中?笔者认为重要的通过这个双指针能够帮助我们简化一些冗余的步骤,从而提高算法效率。对于双指针这个算法,往往应用于一个封闭,固定的场景,比如数组,链表等,一般而言其长度是不会变化的。因此在这种场景下,当我们为了去满足需求时,往往会考虑暴力求解的方法,因为在这个场景下,所有的可能性是唯一的,我们只需要嵌套多层嵌套去穷举,与所求进行比对便可以拿到我们想要的结果。
但是当穷举数据过多,未免时间复杂度就会过大,这时候通过双指针的方法我们就能够将其中一些不必要的穷举省去,达到降低复杂度的效果。原本为 O(N^2) 的暴力穷举,可能只需要 O(N) 就可以解决,即降低一层。
3. 具体案例
那么在实际应用中,我们到底是如何通过双指针来达到降低时间复杂度的效果呢?下面我们就来通过几个案例来看看。
注:以下题目的解法相比于暴力穷举,双指针可能并不是唯一的优化算法,但是限于本文,于是采取双指针的解法。
3.1 两数之和

3.1.1 题目解析
对于这个题目,我们要知道这个题目的要求是要在给定数组中找到两个下标不同的元素,其之和为给定数字,并将其下标进行返回。
3.1.2 算法原理
首先,当我们拿到这道题目的时候第一个想到的就是暴力穷举法,通过两层循环,来判断是否与 target 相等,时间复杂度为 O(N^2)。
但是要怎么优化呢,就可以通过双指针的方法。第一,我们会发现这个数组是固定长度;其次在进行双指针之前,我们需要先对数组进行一个升序的排序(降序也可以),排序之后,我们就会发现其实有些穷举是没有必要的。我们以排完序的数组为例:2,5,8,15,16,在这之中我们想找和为 7 的两个数字,当我们将 2 和 5 加起来等于 7 的时候,对于后面的数字的其实我们就无需考虑了,因为这是一个升序的数组,后面的数字之和一定会比 2 和 5 加起来大,这也是我们优化的地点。
那么代码具体是如何实现呢:
- 对给定数组进行升序排序
- 采取双指针 left 和 right,分别指向数组的开头和结尾,即最小和最大的元素
- 如果他们之和大于所需数字,left 指针++;小于则 right 指针--,直至 left 指针与 right 指针位置相交,即说明当前数组内不存在符合需求的两个数字。
图示如下:
找到了





