https://leetcode.com/problems/container-with-most-water/

给出一堆数,是一个一维向量上的高。求出左右两个数作为高度,最大的装水的面积。

 

第一种,最笨的办法,就是  轮询,o(n^2)的搜索。

一个指针指向左侧,一个指向右侧,通过枚举出所有的组合,找出最大的即可。

int maxArea(vector<int>& h) {
    int left ,right;
    int ans = 0;
    for(left = 0; left + 1< h.size(); left++)
    {
        for(right = left + 1; right < h.size(); right ++)
        {
            ans = max(ans, (right - left)*min(h[left],h[right]));
        }
    }

    return ans;
}
这样的代码提交是会超时的。

 

第二种方法,我们让两个指针分别指向数组的头和尾,这样来遍历数组。

    int maxArea_(vector<int>& h) {
        int ans = 0;
        int tmp;
      // i是左侧的挡板,j是右侧挡板。
for(int i = 0, j = h.size()-1; i < j; ) {
        //比较低的挡板就是那个高。
if(h[i] < h[j]) { tmp = h[i] * (j - i);
          // 如果h[i]比较低的话,右侧已经无法再突破了。
          // 因为移动j,容器的高高仍然是h[i],而j-i在缩短,容量只会变小。不可能找到最大值。
          //所以这种情况下,移动i才有可能找到最大值。
i
++; } else  //另一种同理 { tmp = h[j] * (j - i); j--; } // 更新最大容量 ans = max(ans, tmp); } return ans; }

这种每次逼近的方式,类似于一个排序数组,找两个数的和等于某个数的搜索方法。利用了某种特性,最后实现是线性的复杂度。

 

posted on 2019-03-28 10:55  newbird2017  阅读(108)  评论(0编辑  收藏  举报