求解twitter面试题(墙壁装水问题)
2015-02-04 15:07
295 查看
看见twitter上一道面试题,题目是这样的,试着做了一下
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
思路分析:
1. 找出该数组最大的元素(row);
2. 将该数组以该最大值为边界分为左右两侧分别计算;
3. 计算左侧
3.1 找出左侧最大的值(left_row)
3.2 计算left_row和row之间(left_row的右侧到row)的蓄水量,由于该范围两个端点的值最大,所以无论中间什么情况,水的上界和两个端点较小值是相同的;
3.3 以left_row为新的右侧边界,重复3.1,直到左侧到达数组的最左边的值
4. 右侧方法和左侧类似
代码验证(matlab)
生成的随机数组柱状图如下
代码:
验证结果:
volume=219
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
思路分析:
1. 找出该数组最大的元素(row);
2. 将该数组以该最大值为边界分为左右两侧分别计算;
3. 计算左侧
3.1 找出左侧最大的值(left_row)
3.2 计算left_row和row之间(left_row的右侧到row)的蓄水量,由于该范围两个端点的值最大,所以无论中间什么情况,水的上界和两个端点较小值是相同的;
3.3 以left_row为新的右侧边界,重复3.1,直到左侧到达数组的最左边的值
4. 右侧方法和左侧类似
代码验证(matlab)
生成的随机数组柱状图如下
代码:
clc;clear; %生成随机数组 n=5; x=magic(n); x=reshape(x,1,n*n); x=[0,x,0]; %边值为0 [x1,row]=max(x); rx=x(row:n*n+2); volume=0; %最大值左侧遍历 i=row; while i>3 lx=x(1:i-1); [x_left, row_left]=max(lx); calculableV=x(row_left:i); volume=calculateV(calculableV)+volume; i=row_left; end %最大值右侧遍历 i=row; while i<n*n rx=x(i+1:n*n+2); [x_right, row_right]=max(rx); row_right=row_right+i; calculableV=x(i:row_right); volume=calculateV(calculableV)+volume; i=row_right; end volume bar(x);
function [volume] = calculateV(x) %CALCULATEV Summary of this function goes here % Detailed explanation goes here v=0; [a b]=size(x); if x(1) >= x(b) want=b; else want=1; end for i=2:b-1 v=v+x(i); end volume=x(want)*(b-2)-v; end
验证结果:
volume=219
相关文章推荐
- 水池问题的lua语言算法(面试题分析:我的Twitter技术面试失败了)
- 算法实践——Twitter算法面试题(积水问题)的线性时间解法
- SQL语句面试题求解——学生分数问题
- twitter面试题之装水问题
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 有趣的积水问题(Twitter编程面试题)
- 水池问题的lua语言算法(面试题分析:我的Twitter技术面试失败了)
- 动态规划求解抛鸡蛋问题(Google某年面试题)
- 对一道Twitter面试题(墙面盛水问题)的解答
- Unity3d人物与墙壁碰撞问题求解
- Twitter面试题之墙之间的水坑装雨水问题
- 通用逻辑问题求解程序
- A*m+B*n=D问题的数学推导求解
- 回溯法求解8皇后问题(转帖)
- 全排列问题之递归求解
- [转]最长递增子序列问题的求解
- 求解在SQL中使用了where列所遇到的问题
- 全排列问题之递归求解
- 以前的作业:八皇后问题求解
- sas软件求解线性、非线性和整数问题