leetcode11:双指针法为什么不会遗漏正确答案?

解法一:两次for循环,时间复杂度O(n^2),由于测试用例的数组很大,没有通过(所以难度是medium……);

解法二:双指针

第一次看到双指针方法的的时候,心里想的就是和嵌套循环相比,难道双指针法不会排除掉正确答案吗?毕竟它没有像嵌套循环那样穷尽所有的可能性。看了题解,想了半天才理解:每次指针的移动确实排除掉了一部分可能组合,但这些组合只可能小于等于现有的最大值,因此不用担心单次移动排除掉正确答案。

首先,两个指针的初始位置分别是0和height.length-1,即数组的最左端和最右端。

在第11题给出的例子中,左边的指针初始位置为0,右边的指针初始位置为8。比较第0条柱子和第8条柱子的高度,发现第0条比第8条低。从双指针法的角度看,现在需要作出决策:一、让左指针右移;二、让右指针左移。哪个决策更好?

我最开始的理解是,由于左指针的高度(1)比右指针的高度(7)小,如果选择让右指针左移,宽度会变小,且水平面不会变,因此矩形面积必定减小,因此应该移动左指针(面积可能变大可能变小)。但这个理由其实没有说服力,移动右指针不好不能推出移动左指针一定更好,万一移动右之后的下一步移动,收益更大呢?(或许可以排除这种可能,但我的脑子理解不来)

一个更容易理解的角度是,每次移动指针都排除掉了当前柱子和其他所有柱子的可能组合。比如左指针从0移动到1,那么我就放弃了柱子0和柱子1-8的8种组合。为什么能放弃呢?因为柱子0和柱子1-8的8种矩形面积最多也不会超过8(柱子1-8再高,也会被柱子0限制,因此高度最高为1,宽度最高为8),而我已经把8存到了我的maxarea中了,因此这种排除是无风险的,还能够节约遍历这8个组合的时间。

那么,在知道左指针比右指针的高度低的情况下,我移动右指针会有什么后果?

这将排除柱子0-7与柱子8的8种组合,但我不知道这8种组合中,有没有一种组合的面积比我现有的最大面积8要大,因此我不敢排除。