刷题31-收集雨水

原题链接

扩展题目一------种花时间

题目描述


给出n个数字,表示一个高程图,高程图中每一条的宽度为1,
请计算下雨之后这个地形可以存储多少水
例如
给出[0,1,0,2,1,0,1,3,2,1,2,1],返回6.

在这里插入图片描述

上面的高程图用数组[0,1,0,2,1,0,1,3,2,1,2,1]表示。
在这种情况下,6个单位的雨水(蓝色部分)被存储。

示例

输入:
[0,1,0,2,1,0,1,3,2,1,2,1]
输出:
6

参考解法

public class Main {
	public static void main(String[] args) {
		int a[] = {0,1,0,2,1,0,1,3,2,1,2,1};
		System.out.println(trap(a));
	}

	public static int trap(int[] a) {
		// 数组中最大值的下标
		int max_index = 0;
		// 最大值左侧的极大值
		int l = 0;
		// 最大值右侧的极大值
		int r = 0;
		int sum = 0;
		for (int i = 0; i < a.length; i++) {
			max_index = a[i] > a[max_index] ? i : max_index;
		}
//		System.out.println(max_index);
		// 左侧的和
		for (int i = 0; i < max_index; i++) {
			if (a[i] < l)
				sum += l - a[i];
			else
				l = a[i];
		}

		// 右侧的和
		for (int i = a.length-1; i > max_index; i--) {
			if (a[i] < r)
				sum += r - a[i];
			else
				r = a[i];
		}

		return sum;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值