42 接雨水(正 1)

2021-10-08 16:18:18 字數 2360 閱讀 8031

/*

解法一:按行求

一層一層的遍歷,先遍歷第一層,再第二層,,,

*/public

inttrap

(int

height)

if(height[j]

>= i)}}

return sum;

}private

intgetmax

(int

height)

}return max;

}

/*

方法二:按列求

*/public

inttrap

(int

height)

}int max_right =0;

//找出右邊最高

for(

int j = i +

1; j < height.length; j++)}

//找出兩端較小的

int min = math.

min(max_left, max_right)

;//只有較小的一段大於當前列的高度才會有水,其他情況不會有水

if(min > height[i])}

return sum;

}

/*

方法三:動態規劃

*/public

inttrap

(int

height)

for(

int i = height.length -

2; i >=

0; i--

)for

(int i =

1; i < height.length -

1; i++)}

return sum;

}

/*

方法四:三指標

*/public

inttrap

(int

height)

}//統計最高柱子左邊能接的雨水數量

int left = height[0]

;int right =0;

int water =0;

for(

int i =

1; i < maxindex; i++

)else

}//統計最高柱子右邊能接的雨水數量

right = height[height.length -1]

;for

(int i = height.length -

2; i > maxindex; i--

)else

}//返回盛水量

return water;

}//雙指標

public

inttrap

(int

height)

else

}return water;

}

/*

方法五:棧

*/public

inttrap6

(int

height)

int distance = current - stack.

peek()

-1;//兩堵牆之前的距離。

int min = math.

min(height[stack.

peek()

], height[current]);

sum = sum + distance *

(min - h);}

stack.

push

(current)

;//當前指向的牆入棧

current++

;//指標後移

}return sum;

}public

inttrap

(int

a)else

}return maxwater;

}

/*

方法六:數學法

*/public

inttrap

(int

height)

fangge = math.

max(maxleft, maxright)

* height.length;

return

(s1 + s2)

- fangge - zhuzi;

}

/*

*/public

inttrap

(int

a)else

}return max;

}

LeetCode題解 42 接雨水

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...

42 接雨水 雙指標

對於乙個較低的坑來說,其儲水量高度取決於左側最高柱與右側最高柱的較小高度 可以用兩個指標,分別從左右兩邊往中間逼近,左側或者右側的儲水量只取決於當前一側的高度差 if len height 0 return 0left,right 0,len height 1 left max,right max ...

單調棧 42 接雨水

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...