Trapping Rain and most Contain

兩道經典的題目
1、給定一組柱子,求這組柱型所能存儲的雨水總量
對於某個柱子上存放的雨水量是由其左右兩邊的柱子決定的,即左邊>=該柱子的最高柱子和右邊>=的最高柱子共同決定。
利用兩個數組left和right 保存這兩個信息,
Trapping Rain

/**
 * @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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章