柵欄盛水最大值問題求解
阿新 • • 發佈:2018-11-01
問題描述:
給定 n 個正整數 a1,a2,...,an,其中每個點的座標用(i, ai)表示。 畫 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; }