O(n)时间解决的面试题:下雨积水量问题
2015-05-23 11:09
369 查看
问题描述
如下图所示,给定一个数组[0,1,0,2,1,0,1,3,2,1,2,1],对应每个轴上的高度,求能积水的水量
分析问题
每一块水域的高度等于它左边最大值和右边最大值中的最小值。
解决问题
class solution{
public:
int trap(vector<int> &A){
int n=A.size();
int result=0;
vector<int> left(n),right(n);
for(int i=0;i<n;i++){
//前缀的最大值
//left中存放从0~i的最大值,显然,最大值要么是A[i],要么和之前的一样
left[i]=i?max(left[i-1],A[i]):A[i];
}
//后缀的最大值
for(int i=n-1;i>=0;--i){
right[i]=i==n-1?A[i]:max(right[i-1],A[i]);
}
//对于第i块来说,它的值是前缀的最大值和后缀的最大值中最小的那个
for(int i=0;i<n;++i){
result+=min(left[i],right[i])-A[i];
}
return result;
}
}
如下图所示,给定一个数组[0,1,0,2,1,0,1,3,2,1,2,1],对应每个轴上的高度,求能积水的水量
分析问题
每一块水域的高度等于它左边最大值和右边最大值中的最小值。
解决问题
class solution{
public:
int trap(vector<int> &A){
int n=A.size();
int result=0;
vector<int> left(n),right(n);
for(int i=0;i<n;i++){
//前缀的最大值
//left中存放从0~i的最大值,显然,最大值要么是A[i],要么和之前的一样
left[i]=i?max(left[i-1],A[i]):A[i];
}
//后缀的最大值
for(int i=n-1;i>=0;--i){
right[i]=i==n-1?A[i]:max(right[i-1],A[i]);
}
//对于第i块来说,它的值是前缀的最大值和后缀的最大值中最小的那个
for(int i=0;i<n;++i){
result+=min(left[i],right[i])-A[i];
}
return result;
}
}
相关文章推荐
- O(n)时间解决的面试题:名人问题
- 解决Ubuntu与Windows双系统的时间不同步问题
- jquery UI Datepicker时间控件冲突问题解决
- 解决一个mysql关于按文章以及评论的最早时间的排序问题
- python笨办法解决zipfile解压会改变文件最后修改时间的问题
- 解决2008系统中使用java的Date获取时间总是比实际时间差了8个小时的问题
- 购物车清空转发与重定向问题(使用Session来保存客户一次会话的信息记录)???时间问题,待解决!还没解决
- [VB.NET]VB.net 读写ini的问题,希望好心人贡献下时间,帮忙解决下~~
- win10自动设置时间打不开问题的解决方法
- 解决VMware虚拟机时间同步问题
- bind 9 安装 配置 master slave .. 不是很难,但其中也遇到些问题。。耗费了点时间解决
- 解决导出excel表格时间慢的问题
- 解决weblogic与系统时间相差8小时的问题
- eclipse时间问题解决
- Xen虚拟机加入Puppet环境如何解决时间同步问题 推荐
- 解决使用SimpleDateFormat解析时间字符串的Locale问题
- linux环境下启动tomcat7出现时间过长(已经编译完成的项目)问题解决!
- 如何解决weblogic与系统时间相差8小时的问题
- discuz解决栏目时间类型问题
- 如何解决DNS缓存时间问题