博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google面试题——蓄水问题
阅读量:6757 次
发布时间:2019-06-26

本文共 1455 字,大约阅读时间需要 4 分钟。

问题:

有一块矩形土地被划分成 N×M 个正方形小块,每块是一平方米。这些小块高低不平,每一小块地都有自己的高度H(i, j)米。水可以由任意一块地流向周围四个方向的四块地中,但不能直接流入对角相连的小块中。一场大雨后,许多低洼地方都积存了不少降水,求出它最多能积存多少立方米的降水么?

思路:

先看一维的情况如何处理:

预处理: 对每个格子求左边和右边的最高高度。 遍历每个格子: 找到左右最高高度的较小值,看是否大于这个格子的高度,如果大于则高度差就是这个格子存的水量。N个格子的积水量相加就是结果。

代码如下:(转自:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;//有一块矩形土地被划分成 N×M 个正方形小块,每块是一平方米。这些小块高低不平,//每一小块地都有自己的高度H(i, j)米。水可以由任意一块地流向周围四个方向的四块地中,//但不能直接流入对角相连的小块中。一场大雨后,许多低洼地方都积存了不少降水,求出它最多能积存多少立方米的降水么?int trap(int* a, int n){ if ( a == NULL || n == 0 ) return 0; int* left = new int[n]; if ( left == NULL ) return 0; int* right = new int[n]; if ( right == NULL ) return 0; int maxL = 0; for ( int i = 0 ; i < n-1; i++ ) { left[i] = maxL; maxL = max(maxL, a[i]); } int maxR = 0; for ( int i = n-1; i >= 0; i-- ) { right[i] = maxR; maxR = max(maxR, a[i]); } int res = 0; for ( int i = 0 ; i < n-1 ;i++) { int v = min(left[i], right[i]) - a[i]; if ( v > 0 ) res += v; } delete[] left; delete[] right; return res;}

一维的相对简单,那么二维的如何处理呢?

下面是中的讨论的一些思路:

一种思路是找出四周最低的一块,从那开始灌水。先把四周的高度加入优先队列(priority queue, 或heap),取出最低的向四周扩展,低于就注水,高于就加入堆。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2012/12/11/4767245.html

你可能感兴趣的文章
android中判断sim卡状态和读取联系人资料的方法【转】
查看>>
golang slice 切片原理
查看>>
ab命令压力测试
查看>>
让div span等元素能响应键盘事件
查看>>
mongodb修改器
查看>>
iOS blocks - 三個會造成retain cycle的anti patterns
查看>>
基于任务模型的软件开发
查看>>
搭建LoadRunner中的场景(四)控制器的全局设置
查看>>
ChromeDriver和PhantomJS配置到$PATH
查看>>
正则表达式
查看>>
加密算法中包含不可读的字符服务器丢失
查看>>
vscode中安装使用markdown 插件
查看>>
leetcode 11. 盛最多水的容器
查看>>
图的m着色问题
查看>>
剑指offer——面试题4:二维数组中的查找
查看>>
引用数据类型赋值的具体步骤
查看>>
centos6.4双网卡实现共享上网
查看>>
UVA10474 Where is the Marble?
查看>>
二进制128位整数运算
查看>>
Linux shell编程学习笔记-----第七章
查看>>