今天遇到了一道题,题目的大致意思是输入给你一个含有数字元素的列表,各数字的大小表示容器的高度,要在其中选出两个元素得出它们的面积最大,这里的面积是由二者之间的索引距离和高度短板来决定的;例子的截图如下:
起初我用了暴力穷举的方法,然而提交结果的时候发现时间太长,无奈之下,看了一下大神们的解答过程,发现该题要使用双指针法进行,在该题就是在列表的两侧设立指针设左右的指针分别为i,j,两侧指针向中间靠近,直到二者遇见;由于面积是由二者的索引距离以及短板决定的,面积可表示如下:
所以非短板一侧向内靠近,由于高度由短板决定,而索引又较之前缩短,因此面积一定会变小,因此此时不能移动非短板,而移动短板则可能会变大;
以下是力扣网站的jyd作者的原话:
因此,向内收窄短板可以获取面积最大值。换个角度理解:
若不指定移动规则,所有移动出现的 S(i, j)S(i,j) 的状态数为 C(n, 2)C(n,2),即暴力枚举出所有状态。
在状态 S(i, j)S(i,j) 下向内移动短板至 S(i + 1, j)S(i+1,j)(假设 h[i] < h[j]h[i]
短板高度:相比 S(i, j)S(i,j) 相同或更短(<= h[i]<=h[i]);
底边宽度:相比 S(i, j)S(i,j) 更短。
了解了这些以后代码的编写就容易了许多: