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