CODE 91: Trapping Rain Water

本文介绍了一种使用栈数据结构的方法来计算给定地形高度图中能够积存的雨水总量。通过遍历高度数组并利用栈记录当前高度及其索引,算法能够精确计算每个位置上的水容量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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[] A) {
		// IMPORTANT: Please reset any member data you declared, as
		// the same Solution instance will be reused for each test case.
		if (A.length <= 2) {
			return 0;
		}
		Stack<Integer> hights = new Stack<Integer>();
		Stack<Integer> index = new Stack<Integer>();
		hights.push(A[0]);
		index.push(0);
		int sum = 0;
		for (int i = 1; i < A.length; i++) {
			if (A[i] > hights.peek()) {
				if (hights.size() <= 1) {
					hights.pop();
					index.pop();
					hights.push(A[i]);
					index.push(i);
				} else {
					while (A[i] > hights.peek() && hights.size() >= 2) {
						int before = hights.pop();
						int beforeIndex = index.pop();
						int bbefore = hights.pop();
						int bbeforeIndex = index.pop();
						int minBorad = Math.min(A[i], bbefore);
						sum += (i - bbeforeIndex - 1) * (minBorad - before);
						hights.push(bbefore);
						index.push(bbeforeIndex);
					}
					if (hights.size() <= 1 && A[i] > hights.peek()) {
						hights.pop();
						index.pop();
						hights.push(A[i]);
						index.push(i);
					} else if (A[i] < hights.peek()) {
						hights.push(A[i]);
						index.push(i);
					} else if (A[i] == hights.peek()) {
						index.pop();
						index.push(i);
					}
				}
			} else if (A[i] < hights.peek()) {
				hights.push(A[i]);
				index.push(i);
			} else {
				index.pop();
				index.push(i);
			}
		}
		return sum;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值