算法学习--2 俩端指针问题

一 题目

  • 1.给定一个非负数的数组,代表一个容器。例如数组[0,1,0,2,1,0,1,3,2,1,2,1],如果用这个容器接水的话,请问可以接多少水
  • 2.给定一个非负数的数组,数组中的每个值代表一个柱子的高度,柱子的宽度是 1。两个柱子之间可以围成一个面积,规定:面积=两根柱子的最小值*两根柱子之间的距离。比如数组[3,4,2,5]。3 和 4 之间围成的面积为 0,因为两个柱子是相邻的,中间没有距离。3 和2 之间围成的面积为 2,因为两个柱子的距离为 1,且 2 是最短的柱子,所以面积=1*2。3 和 5 之间围成的面积为 6,因为两个柱子的距离为 2,且 3 是最短的柱子,所以面积=3*2。求在一个数组中,哪两个柱子围成的面积最大,并返回值

二 要求

    1. 要求:实现时间复杂度 O(N),额外空间复杂度 O(1)的解法

三 解题思路

  • 1.对于题目1,依次算出每个位置能装多少水是一个很好的办法,但是每个位置上的水该怎么计算才能实现O(N)呢?用俩个n维的数组来保存每个位置左右的最大值的话额外的空间复杂度又不为O(1)了,所以也不满足。一个位置上能放多少水是由它左右俩边的最大值决定的,假设给俩端赋一个指针,表示进行到哪个位置了,如果能通过逐步更新这俩个指针的位置来逐步计算每个点能存放的水量了就好了对不对?这样才能实现时间复杂度O(N),额外空间复杂度O(1)对不对?实际做法就是这样的,比较左指针以左的最大值与右指针以右的最大值谁小,小的那个就向中间进一位,直到俩个指针相遇,因为小的那一个说明与它临近的那个位置的限制就是这个小的值,另外一个很远的值已经比它大了,不是它的限制了,所以这个位置上能装的水量已经能算出来了。
  • 2.也是初始位置俩个指针在俩端,用一个数记录最大的面积,然后去掉较小的那个值再继续更新,为啥可以去掉最小的哪个呢?因为长度比它短并且最小值小于或者等于这个最小值,围成的面积不可能比原来记录的那个最大值大了,所以如果还有较大的值的话不会包括这个点了,所以可以去掉了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值