11.leetcode Container With Most Water(medium)[分析规律减少搜索空间]

来源:互联网 发布:书生软件手机版 编辑:程序博客网 时间:2024/06/14 18:43

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.

求(i-j)*min(ai,aj)的面积,这里其实就是求任意两个隔板间最大的装水量,为距离与较低隔板的高度的乘积。暴力破解就是O(n2),但是这里我们知道整个面积受两个因素的影响,一个是长度abs(i-j),当i、j分别为数组的首尾时最大,然而此时的min(ai,aj)不一定是最优的。因此从两端往中间遍历,最大面积的j的右端不会有比它高的线,i的左边也不会有比它高的线。所以对于每个当前的较小的线,往右或者往左查找第一个比height[i]高的数值作为可能的备选得到面积。

class Solution {public:    int maxArea(vector<int>& height) {        int area = 0;        int n = height.size();        if(n<=0) return area;        /*for(int i=0;i<n-1;i++) //暴力解决           for(int j= i+1;j<n;j++)        {            int a = j-i;            int b = height[i]>height[j]?height[j]:height[i];            if(area<a*b)                area = a*b;        }*/        //由于长最长的时候一定是整个数组的长度,但是高可能会影响,所有每次从两边往中间值,存放可能出现最大值的暂存值        int i=0,j=n-1;        while(i<j)        {            int b = height[i]>height[j]?height[j]:height[i];            if((j-i)*b > area)               area = (j-i)*b;            if(height[i]<height[j])            {                int temp = i;                while(height[temp]<=height[i]&&temp<j)//找到第一个比height[i]高的数值作为可能的备选                     ++temp;                i = temp;                            }else            {                int temp = j;                while(height[temp]<=height[j]&&temp>i)                     --temp;                j = temp;            }                    }        return area;    }};






0 0