Google面试题——蓄水问题
2012-12-11 16:23
956 查看
问题:
有一块矩形土地被划分成 N×M 个正方形小块,每块是一平方米。这些小块高低不平,每一小块地都有自己的高度H(i, j)米。水可以由任意一块地流向周围四个方向的四块地中,但不能直接流入对角相连的小块中。一场大雨后,许多低洼地方都积存了不少降水,求出它最多能积存多少立方米的降水么?
思路:
先看一维的情况如何处理:
预处理: 对每个格子求左边和右边的最高高度。 遍历每个格子: 找到左右最高高度的较小值,看是否大于这个格子的高度,如果大于则高度差就是这个格子存的水量。N个格子的积水量相加就是结果。
代码如下:(转自:https://github.com/codingtest/interview/blob/master/code2.cpp)
一维的相对简单,那么二维的如何处理呢?
下面是http://weibo.com/lirenchen?key_word=%E6%B0%B4&is_search=1#1355214198625中的讨论的一些思路:
一种思路是找出四周最低的一块,从那开始灌水。先把四周的高度加入优先队列(priority queue, 或heap),取出最低的向四周扩展,低于就注水,高于就加入堆。
有一块矩形土地被划分成 N×M 个正方形小块,每块是一平方米。这些小块高低不平,每一小块地都有自己的高度H(i, j)米。水可以由任意一块地流向周围四个方向的四块地中,但不能直接流入对角相连的小块中。一场大雨后,许多低洼地方都积存了不少降水,求出它最多能积存多少立方米的降水么?
思路:
先看一维的情况如何处理:
预处理: 对每个格子求左边和右边的最高高度。 遍历每个格子: 找到左右最高高度的较小值,看是否大于这个格子的高度,如果大于则高度差就是这个格子存的水量。N个格子的积水量相加就是结果。
代码如下:(转自:https://github.com/codingtest/interview/blob/master/code2.cpp)
#include <stdio.h> #include <vector> #include <string> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> 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 ; if ( left == NULL ) return 0; int* right = new int ; 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; }
一维的相对简单,那么二维的如何处理呢?
下面是http://weibo.com/lirenchen?key_word=%E6%B0%B4&is_search=1#1355214198625中的讨论的一些思路:
一种思路是找出四周最低的一块,从那开始灌水。先把四周的高度加入优先队列(priority queue, 或heap),取出最低的向四周扩展,低于就注水,高于就加入堆。
相关文章推荐
- Google面试题——蓄水问题
- 求子数组的最大和问题--一道浙江大学考研压轴题(被Google拿来做面试题)
- Google 面试题 - 两个字符串的匹配问题(转)
- 动态规划求解抛鸡蛋问题(Google某年面试题)
- Google面试题-高楼扔鸡蛋问题
- Google面试题之经典鸡蛋问题
- 摔棋子(摔杯子)问题——解答Google的一道面试题
- 5个广口瓶被污染的药片,没污染的药每片10mg,被污染的每片9mg,一次称重找出被污染药瓶的问题 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- Google面试题 图论的问题
- Google面试题-高楼扔鸡蛋问题
- 【动态规划】 Google面试题 爬楼梯问题 斐波那契问题的多种解法
- 127名选手1:1淘汰赛决出优胜者问题 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- 一道google面试题(dp)
- 【Android:<一>】解决google下载缓慢的问题
- [从面试题看问题]线程篇(一)
- Java面试题——关于String创建几个对象问题
- 一个Hibernate 的面试题, 现场分析问题
- 面试题—过河问题
- push代码到code.google.com出错问题解决
- 你想问百度、Google工程师什么问题?