สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มไม่ติดลบ n ตัว แสดงความสูงของแท่งกว้าง 1 เราต้องคำนวณว่าหลังฝนตกจะเก็บน้ำได้เท่าไร
ตัวอย่าง: [2,5,2,0,5,8,8] สามารถเก็บน้ำได้ 8 หน่วย (เห็นจากกราฟ)
ขั้นตอนการแก้ปัญหา (ใช้ Stack)
- สร้างสแต็ก
stack,water = 0,i = 0 - วนลูป while
i < len(height):- ถ้า
stackว่าง หรือheight[stack[-1]] >= height[i]:- เพิ่ม
iเข้าstack, เพิ่มiขึ้น 1
- เพิ่ม
- อื่นๆ:
x = stack[-1], นำstack.pop()ออก- ถ้า
stackไม่ว่าง:temp = min(height[stack[-1]], height[i])dist = i - stack[-1] - 1water += dist * (temp - height[x])
- ถ้า
- คืนค่า
water
ตัวอย่างโค้ด Python
class Solution(object):
def trap(self, height):
stack = []
water = 0
i = 0
while i < len(height):
if len(stack) == 0 or height[stack[-1]] >= height[i]:
stack.append(i)
i += 1
else:
x = stack[-1]
stack.pop()
if len(stack) != 0:
temp = min(height[stack[-1]], height[i])
dist = i - stack[-1] - 1
water += dist * (temp - height[x])
return water
ob = Solution()
print(ob.trap([2,5,2,0,5,8,8])) # Output: 8
อินพุต / เอาต์พุต
Input: [2,5,2,0,5,8,8]
Output: 8