题目
思路
暴力枚举:2层for,枚举所有柱子的组成情况,实时维护最大的面积
双指针:从外向内枚举
int maxArea(vector<int>& a)
{
int n = a.size();
int ret = 0;
int i = 0;
int j = n-1;
while(i<j) //双指针方法
{
int curArea = (j-i)*min(a[i],a[j]);
ret = max(ret,curArea);
if(a[i] <= a[j])//核心思路:移动较小的柱子
{
i++;
}
else
{
j--;
}
}
return ret;
}
总结
- 双指针的核心思路:如何移动指针,依据什么条件?
1、整体,从外往内,移动指针。这样的话,就不需要双层for去枚举所有情况了
2、双指针移动,一定是移动更低的那根柱子,因为目标是去找更大的面积 = 宽*高,宽度由i和j决定,且宽度一定是变小的过程。那么面积的决定性因素就是高度了。如果移动更高的那根柱子,那么未来所有基于 当前更低 的这根柱子 的面积,一定是更小的,更低的这根柱子决定了未来所有矩形的高度只能是它。所以,移动更高的柱子没有意义,不会有更大的面积了。
但,移动更低的柱子,那么更高的柱子在未来就有可能成为组成面积的一部分(遇到更高的柱子),面积相较于当前肯定更大。