LeetCode.11. 盛最多水的容器

68 阅读1分钟

题目


image.png

image.png

思路


暴力枚举: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决定,且宽度一定是变小的过程。那么面积的决定性因素就是高度了。如果移动更高的那根柱子,那么未来所有基于 当前更低 的这根柱子 的面积,一定是更小的,更低的这根柱子决定了未来所有矩形的高度只能是它。所以,移动更高的柱子没有意义,不会有更大的面积了。
但,移动更低的柱子,那么更高的柱子在未来就有可能成为组成面积的一部分(遇到更高的柱子),面积相较于当前肯定更大。