两道经典的题目
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;
};