算法设计与分析作业6

                       11. Container With Most Water

Description:

Given n non-negative integers a1a2, ..., an , where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

 

算法设计与分析作业6

The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

 

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

解题思路:

题目要求求出容器最大盛水量,计算方式为底长乘高,高度决定于较短的板,首先可以用暴力求解算出所有的结果并比较得出最大容积。代码如下:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max = 0;
        int h;
        for(int i = 0; i < height.size(); i++){
            for(int j = i+1; j < height.size(); j++){
                if (height[i] > height[j]) {
                    h = height[j];
                } else {
                    h = height[i];
                }
                if(h*(j-i) > max)
                    max = h*(j-i);
            }
        }
        return max;
    }
};

第二种思路为利用双指针减少没有必要的遍历从而更快算出最大容积,初始状态下左指针指向第一块板,右指针指向最后一块板,此时容积为底长乘较短板高度,指针往中间移动时底长变短,若移动的是指向高的板的指针,则底长变短,容积为底长乘较短板高度,容积比原来小,所以每次移动指向较短板的指针。代码如下:


class Solution {
public:
    int maxArea(vector<int>& height) {
        int maxArea = 0;
        int i = 0;
        int j = height.size()-1;
        while (i < j) {
            int h = min(height[i], height[j]);
            maxArea = max(maxArea, h*(j - i));
            if(h == height[i]) ++i;
            if(h == height[j]) --j;
        }
        return maxArea;
    }
};