42. Trapping Rain Water

來源:互聯網
上載者:User

標籤:

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

 

 

此題與給小孩分糖那題很相似,都是可以左邊遍曆一遍,右邊遍曆一遍。

public int Trap(int[] height) {        int max =0;        int res = 0;        int size = height.Count();        if(size <= 2) return res;        var maxArr =new int[size];        for(int i = 0;i< height.Count();i++)        {            maxArr[i] =Math.Max(height[i],max);            max = Math.Max(max,height[i]);        }        int rightMost  =0;        int lessHeight = 0;        for(int i = size -1 ;i>=0;i--)        {            rightMost = Math.Max(rightMost, height[i]);            lessHeight = Math.Min(rightMost, maxArr[i]);            res +=  (lessHeight - height[i] > 0)?lessHeight - height[i] : 0;        }        return res;    }

 

參考OJ上大神的做法,用stack只存比peek值小的元素的index,因為index要用來算兩個邊之間的寬度。這個方法是將水分層了,也就是比如test case中間存水的部分,因為先出現1的右邊邊界,先加上1的水,後來又遇到3的邊界,左邊為1時沒有水加入,左邊為2時加入水,水的高度為更低的邊與基地的差(Min(2,3)-1)。

 

 public int Trap(int[] height) {        int res = 0;        int size = height.Count();        if(size <= 2) return res;        int i =0;        var stack = new Stack<int>();//store the largerst heigth index        while(i< size)        {            if(stack.Count()==0 || height[i] <= height[stack.Peek()]) stack.Push(i++);            else            {                int bot = stack.Pop();                res += (stack.Count()==0)?0:((Math.Min(height[stack.Peek()], height[i]) - height[bot])*(i - stack.Peek()-1));;             }        }        return res;    }

 

42. Trapping Rain Water

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.