求解twitter面试题(墙壁装水问题)

来源:互联网 发布:网络免费短信平台 编辑:程序博客网 时间:2024/06/10 18:52

看见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)

生成的随机数组柱状图如下



代码:

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;endvolumebar(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

0 0