1. 程式人生 > >柵欄盛水最大值問題求解

柵欄盛水最大值問題求解

問題描述:

給定 n 個正整數 a1a2,...,an,其中每個點的座標用(iai)表示。 畫 n 條直線,使得線 i 的兩個端點處於(i,ai)和(i,0)處。請找出其中的兩條直線,使得他們與 X 軸形成的容器能夠裝最多的水。

 

1.首先想到的是暴力求解複雜度為o(n^2)程式碼補貼出來了。

2.根據實際情況,決定盛水多少的是短板,所以可以進行分析,先把兩塊板置於兩端,如果從板子高度較大端向內移動,則無論如何盛水量都是減少,所以只能移動高度較少的板子,所以可以得到o(n)的解。程式碼如下:

int maxArea(vector<int>& height) {
        int max = 0,low = 0, high = height.size() - 1,temp = 0;
        while(low < high){
            temp = height[low] <  height[high]?height[low++] : height[high--];
            temp *= (high - low + 1);
            max = temp > max?temp : max;
        }
        return max;        
    }