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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值