题解 | #装最多水的容器#

装最多水的容器

http://www.nowcoder.com/practice/c97c1400a425438fb130f54fdcef0c57

思路1:
暴力解答。直接进行两重遍历,寻找面积最大值,计算面积的公式就是
abs(j-i)*min(height[i],height[j])
即,用i、j分别表示容器底的左右边界,二者差值表示底长,i和j对应高度中的较小值表示容器高度,而这乘积即为所求。

代码如下:

class Solution {
public:
    /**
     * 
     * @param height int整型vector 
     * @return int整型
     */
    int maxArea(vector<int>& height) {
        // write code here
        int i = 0;//数组下标
        int j = 0;//容器的底
        int maxV = 0;//记录面积的最大值
        int len = height.size();
        if(len<2)
        {
            return 0;
        }
        //复杂度为O(n^2)
        for(i=0;i<len;i++)
        {
            for(j=0;j<len;j++)
            {
                if(maxV < abs((j-i))*min(height[i],height[j]))
                {
                    maxV=abs((j-i))*min(height[i],height[j]);
                }
            }
        }
        return maxV;
    }
};

思路2:
第一种思路是相当于i,j都从头开始,那么当i在前一半,j在后一半的情况,和,i在后一半,j在前一半的情况,是重复的。于是可以从这个方面来进行优化。
定义两个下标,一个从头开始(left),一个从尾开始(right),对半查找。循环停止的条件就是二者相等,所以一个while循环就可以搞定,保证left<right。
接下来就要计算面积。right-left就是底长,这个很好理解;容器高度还是选择height[left]和height[right]中的较小值;关键在于两个下标如何移动。
假设下标为x和y的时候面积最大,那么当left移到x的时候,如果right > y,那么height[right]一定小于
height[x]和height[y]中的较小值,才能保证假设成立,所以
height[right] < height[x](也就是height[right] < height[left])
height[right] < height[y]
那么此时移动的就应该是right的这个下标,让他向y靠近。
同理right先移到y的情况分析也是像上面一样。
综上,对比height[right] 和 height[left],哪个小就移动哪个下标,left右移进行++操作,right左移进行--操作。

代码如下:

class Solution {
public:
    /**
     * 
     * @param height int整型vector 
     * @return int整型
     */
    int maxArea(vector<int>& height) {
        // write code here
        int maxV = 0;//记录面积的最大值
        int len = height.size();
        if(len<2)
        {
            return 0;
        }
        //优化
        int left = 0;
        int right = len-1;
        while(left < right)
        {
            if(height[left] < height[right])
            {
                maxV=max(maxV,(right-left)*height[left]);
                left++;
            }
            else
            {
                maxV=max(maxV,(right-left)*height[right]);
                right--;
            } 
        }
        return maxV;
    }
};
牛客刷题记录 文章被收录于专栏

记录自己的刷题记录,刷过的题的解法

全部评论

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务