zoukankan      html  css  js  c++  java
  • O(n)时间解决的面试题:下雨积水量问题

    问题描述

       

    如下图所示,给定一个数组[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;

    }

    }

  • 相关阅读:
    HttpWatch 有火狐版本?
    JQgrid的最新API
    jqgrid
    JSON的学习网站
    array创建数组
    Numpy安装及测试
    SQLite3删除数据_7
    SQLite3修改数据_6
    SQLite3查询一条数据_5
    SQLite3查询所有数据_4
  • 原文地址:https://www.cnblogs.com/keedor/p/4523858.html
Copyright © 2011-2022 走看看