leetcode11

本文详细解析了如何找出由垂直线构成的容器中能盛放最多水的两个边界线,探讨了两种算法策略:暴力求解和双指针法,后者通过减少不必要的遍历提高了计算效率。

                       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.

 

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;
    }
};

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值