首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode Trapping Rain Water:雙指針與前後綴最大值法

     編輯:C++ 入門

題目大意

給定非負整數數組 `height` 表示柱狀圖高度,寬度為 1。計算下雨後能接多少雨水。

例:`[0,1,0,2,1,0,1,3,2,1,2,1]` → 6

核心思路:短板效應 + 前後綴最大值

位置 `i` 能接的水高 = `min(左側最高, 右側最高) - height[i]`(若為正)。

方法一:前後綴最大值數組 O(N) 空間

int trap(vector& h) {
    int n = h.size(); if (!n) return 0;
    vector lmax(n), rmax(n);
    lmax[0] = h[0];
    for (int i=1; i=0; i--) rmax[i] = max(rmax[i+1], h[i]);
    
    int ans = 0;
    for (int i=0; i

方法二:雙指針 O(1) 空間(最優)

維護 `left, right` 指針及 `lmax, rmax`:

int trap(vector& h) {
    int l=0, r=h.size()-1, lmax=0, rmax=0, ans=0;
    while (l <= r) {
        if (h[l] <= h[r]) {
            if (h[l] >= lmax) lmax = h[l];
            else ans += lmax - h[l];
            l++;
        } else {
            if (h[r] >= rmax) rmax = h[r];
            else ans += rmax - h[r];
            r--;
        }
    }
    return ans;
}

原理分析

  • 雙指針法利用「較矮側的最高牆決定該側積水」
  • 當 `h[l] <= h[r]` 時,`lmax` 必定 ≤ 真實右側最高,故 `lmax - h[l]` 是準確積水
  • 反之同理,逐步收縮區間,單次遍歷完成

關鍵點總結

  1. 短板效應:積水高度由雙側最高牆較矮者決定
  2. 前後綴分解:將全局依賴拆解為左/右獨立預計算
  3. 雙指針優化:利用單調性消除額外空間,單遍歷完成
  4. 邊界處理:空數組、單元素直接返回 0

此題是「前後綴分解」與「雙指針優化」的教科書級案例,掌握其從 O(N) 空間到 O(1) 空間的推導過程,可觸類旁通解決眾多區間極值問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved