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

文章讨论了解决最大矩形面积问题的两种方法:一是嵌套循环,时间复杂度较高;二是双指针法。通过分析,解释了为何双指针法在排除部分组合的同时不会错过最大面积,以及在移动指针时如何决策以避免排除可能的最大面积组合。
摘要由CSDN通过智能技术生成

解法一:两次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要大,因此我不敢排除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值