• LeetCode


    42. Trapping Rain Water 

    Problem's Link

     ----------------------------------------------------------------------------

    Mean: 

    在坐标上给你一些竖直放置的条形积木,问你这个积木能够容纳多少液体.

    analyse:

    首先找出最高的积木,然后从前往后一直扫到最高积木,从后往前一直扫到最高积木,两部分体积相加即可.

    Time complexity: O(N)

     

    view code

    /**
    * -----------------------------------------------------------------
    * Copyright (c) 2016 crazyacking.All rights reserved.
    * -----------------------------------------------------------------
    *       Author: crazyacking
    *       Date  : 2016-03-05-22.10
    */
    #include <queue>
    #include <cstdio>
    #include <set>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <climits>
    #include <map>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    typedef long long(LL);
    typedef unsigned long long(ULL);
    const double eps(1e-8);

    class Solution
    {
    public:
       int trap(vector<int>& height)
       {
           int len=height.size(),front=0,res=0;
           int max_height=0,max_idx=len-1;
           for(int i=0;i<len;++i)
           {
               if(max_height<height[i])
               {
                   max_height=height[i];
                   max_idx=i;
               }
           }

           while(front<max_idx)
           {
               while(front+1<max_idx && height[front]<height[front+1])
                   ++front;
               int stone=0;
               int back=front+1;
               while(back<max_idx && height[back]<height[front])
               {
                   stone+=height[back];
                   ++back;
               }
               res+=(back-front-1)*height[front]-stone;
               front=back;
           }

           int back=len-1;
           while(back>max_idx)
           {
               while(back-1>max_idx && height[back]<height[back-1])
                   --back;
               int stone=0;
               int front=back-1;
               while(front>max_idx && height[front]<height[back])
               {
                   stone+=height[front];
                   --front;
               }
               res+=(back-front-1)*height[back]-stone;
               back=front;
           }
           return res;
       }
    };

    int main()
    {
       freopen("H:\Code_Fantasy\in.txt","r",stdin);
       int n;
       while(cin>>n)
       {
           vector<int> ve;
           for(int i=0;i<n;++i)
           {
               int tempVal;
               cin>>tempVal;
               ve.push_back(tempVal);
           }
           Solution solution;
           cout<<solution.trap(ve)<<endl;
       }
       return 0;
    }
    /*

    */

    2.方法二:时间O(n),空间(1)

    class Solution
    {
    public:
       int trap(vector<int>& height)
       {
           int left=0,right=height.size()-1;
           int maxLeft=0,maxRight=0;
           int res=0;
           while(left<right)
           {
               if(height[left]<=height[right])
               {
                   if(height[left]>maxLeft)
                       maxLeft=height[left];
                   res+=maxLeft-height[left];
                   left++;
               }
               else
               {
                   if(height[right]>maxRight)
                       maxRight=height[right];
                   res+=maxRight-height[right];
                   right--;
               }
           }
           return res;
       }
    };
  • 相关阅读:
    Linux 笔记:文件名
    Linux 一些有用的能力
    理解Linux内核注释
    Linux 的三种软件安装包介绍
    idea 2019 激活
    wget免登陆下载jdk 8u221
    PowerDesigner每点击一次就会提示打印错误对话框
    FormData使用方法详解
    springboot:配置多个数据源
    CSS3绘制不规则图形,代码收集
  • 原文地址:https://www.cnblogs.com/crazyacking/p/5246929.html
Copyright © 2020-2023  润新知