程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> leetcode第一刷_Trapping Rain Water

leetcode第一刷_Trapping Rain Water

編輯:C++入門知識

很有意思的題目,我一開始的思路受計算柱狀型最大面積那道題的影響,想每次求兩種滿足特定關系的柱子之間的水的量,結果各種錯,各種特殊情況需要排除,我意識到是自己的思路有問題了。

停下來想一下水的體積到底跟什麼有關系?當然可以把是水的地方都加起來,這樣必須看兩個柱子之間的高低關系,還要考慮底部的高度。還有一種方法呢,求整個區域的面積,然後把不是水的地方去掉,剩下的就是水的體積。這種方法好在那裡呢?這種方法所需要的信息都很容易獲得,總的面積怎麼求呢?一左一右兩個指針,然後維護一個當前最底部的高度,如果這兩個指針中最小的那個都比最底部的高度高,那麼整個圖形的總的面積應該加上他們之間超出最底部的那部分。升高最底部的那個變量為兩個柱子中較矮的那個,下一輪循環,移動較矮的那個柱子,直到兩個指針相遇為止。如果出現其中一個或兩個指針位於最底部下面怎麼辦呢,那說明他肯定被淹沒到整個圖形的面積中了,直接更新指針進行下一輪。至於該去掉的部分,其實就是多有的柱子,這個值在什麼時候計算都可以。

class Solution {
public:
    int trap(int A[], int n) {
        if(n < 2)   return 0;
        int l=0, r=n-1, curlevel=0, all=0, block=0;
        while(l<=r){
            if(min(A[l], A[r])>curlevel){
                all += (min(A[l], A[r])-curlevel)*(r-l+1);
                curlevel = min(A[l], A[r]);
            }
            if(A[l]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved