兩道經典的題目
1、給定一組柱子,求這組柱型所能存儲的雨水總量
對於某個柱子上存放的雨水量是由其左右兩邊的柱子決定的,即左邊>=該柱子的最高柱子和右邊>=的最高柱子共同決定。
利用兩個數組left和right 保存這兩個信息,
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
var n=height.length;
var left= new Array(n);
var right=new Array(n);
var i,t;
for( i=0;i<n;i++)
{
left[i]=i;
t=i;
while(t>=0){
t=left[t];
if(height[left[i]]<height[t])
{
left[i]=t;}
t--;
}
}
for(i=n-1;i>=0;i--){
right[i]=i;
t=i;
//find right the higher until end
while(t<n){
t=right[t];
if(height[t]>height[right[i]]){
right[i]=t;
}
t++;
}
}
var sum=0;
for(i=0;i<n;i++){
var l=height[left[i]];
var r=height[right[i]];
sum+=(l>r?r:l)-height[i];
}
return sum;
};
2、Container With Most Water
題目是O(n)的時間複雜度,尋找兩根柱子使得柱子形成的容積最大
利用左右兩個指針,從兩端開始,如果某一端柱高大於後一端柱高,那麼該端往中間靠攏,因爲最短的短板在木桶效應裏面中其關鍵作用
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
var max=0;
var begin=0,end=height.length-1;
while(begin<end){
var v=(end-begin)*(height[begin]>height[end]?height[end]:height[begin])
if(v>max)max=v;
if(height[begin]>=height[end]){
end--;
}else{
begin++;
}
}
return max;
};