双指针算法正确理解
双指针算法
看到网上一堆对于双指针算法的理解,动不动就一堆证明贴上去,觉得真的很傻,明明很简单的一个问题非搞得那么复杂。下面请看最正确的理解(以一个算法题来解释):
下图是题目:
官方解法是:定义两个指针分别对应数组的第一个和最后一个元素,计算其面积,再将两个指针中小的那个向中间移动一次,再计算面积,如果面积比之前的大,则暂定其为最大面积,如此循环,当两个指针距离为一时,循环结束,返回最大面积。
一般的做法:两层for循环,将所有的可能性遍历一次,得出最大面积值。
不理解之处:很多人会觉得这样可能会漏掉一些解。
################################################################
其实这道题的一般解法是我们容易想到的,也是没有争议的,大家都理解,这就是排列组合的方式。但是这种方法太耗费时间,而双指针方法就是为了减少循环的次数,从而减少时间。
本质:双指针法也是排列组合,只不过它中间少了很多次组合方式。
开始理解:
0、我们还是按照排列组合的方式去理解双指针;
1、首先,选择两个元素,我们就按照双指针里,选择首尾两个;
2、这两个元素有一大一小时,我们选择较小的那个元素(一样大的话就选左边那个,无所谓),用其他所有的元素与之相组合(我们就这样一轮一轮的排列组合);
3、我们现在就以小的是左边那个元素为例,将他与其余所有元素结合,计算面积,发现,最后一个元素和他组合起来面积最大。因为,面积由短元素决定,现在我们按照短元素来组合,那么距离越大,面积越大,所以,在这一轮,只需要计算和最远的那个元素组合的面积。
4、上一轮结束,短的那个跟所有元素结合一遍, 最大的那个面积也选出来了,那么进行下一轮,将短元素向中间靠近一步,刚才的短元素我们就不用管了,这时指针还是在一堆元素的两头,他们没有进行过排列组合,我们再以短元素为基础,与其他的相组合,发现这些组合中最大面积一定是首尾两个组合时的面积,我们把这个组合计算出来即可。此时,短元素和其他所有元素也组合了一遍,这些组合的最大面积我们也知道了,那么,将短元素舍弃,将指针向内再进一步,如此循环,,,
5、当两个指针相邻时,一定所有的组合都遍历完成了。所以,一定不会有漏掉的组合。
结论:双指针方法只是在计算之前将那一轮不可能的组合省略了计算面积的这个步骤,所以,不会有最优解被漏掉这种情况。它的核心就是:一轮一轮的组合,把本轮最大面积算一下存起来,一轮组合结束,将该元素舍弃,进行下一轮组合,这样进行下去,一定可以得到最大面积。
最后:双指针就是排列组合,只不过每一轮简化之后,只需要进行一次计算,我们要理解它简化的原理。