1、问题描述
给定一个有n个非负整数的数组,以数组的索引作为x坐标,对应索引的元素值作为y坐标,找到两个坐标(x1,y1)和(x2,y2),使得他们与x轴围成的矩形面积最大。
如下图所示,图中垂直线的高度代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
2、解题思路
- 边界条件:(1)数组的元素个数小于等于2;
- 问题分析:这道题和two-sum问题很像,two-sum问题是要求找到数组和等于某个值的两个数,而这道题是要求找到两个坐标(索引及其对应的元素值),使得它们与x轴围成的面积最大。所以可以采用双指针来解决。在给出具体的双指针移动规则前,我们先来看一下怎么移动才有可能使得面积增大。
- 假设由 h [ i ] h[i] h[i]和 h [ j ] h[j] h[j]以及 x x x轴围成的矩形面积为 S ( i , j ) S(i,j) S(i,j);
- S ( i , j ) = m i n ( h [ i ] , h [ j ] ) ∗ ( j − i ) S(i,j)=min(h[i],h[j]) *(j-i) S(i,j)=min(h[i],h[j])∗(j−i);
- 无论是 i i i还是 j j j往中间移动时, ( j − i ) (j-i) (j−i)都在变小,
- 假设 m i n ( h [ i ] , h [ j ] ) = h [ i ] min(h[i],h[j])=h[i] min(h[i],h[j])=h[i],即两者中最小的为 h [ i ] h[i]