1. 程式人生 > >【Python】收集雨水問題:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量?

【Python】收集雨水問題:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量?

收集雨水問題

給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量?
如輸入:0,1,0,2,1,0,1,3,2,1,2,1;返回6。
收集雨水問題
題目來源

分析思路:

當水盛滿的時候,雨水的面積 = 總面積 - 直方圖的面積
從左向右,找比當前柱子A高的第一個柱子B,把柱子A和B之間填充上水,既設定他們之間的柱子高度變為柱子A的高度
然後在向右找比柱子B高的第一個柱子C,把柱子B和C之間填充上水,既設定他們之間的柱子高度變為柱子B的高度……
當兩個柱子相鄰時不用填充
為了防止漏掉還要從右向左執行一遍
最後雨水的面積 = 總面積 - 直方圖的面積

Python程式碼如下:

from copy import deepcopy
import matplotlib.pyplot as plt


def get_rain(li):
    newli = deepcopy(li)
    size = len(newli)
    # 從左向右填充雨水
    for i in list(range(size - 1)):
        for j in list(range(i + 1, size)):
            if newli[j] >= newli[i]:
                newli[i + 1
:j] = [newli[i]] * (j - i - 1) break # 從右向左填充雨水 for i in list(range(size - 1, 0, -1)): for j in list(range(i - 1, -1, -1)): if newli[j] >= newli[i]: newli[j + 1:i] = [newli[i]] * (i - j - 1) break return newli if __name__ == '__main__'
: li = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] result = get_rain(li) print(result) print("雨水的面積: %d" % (sum(result) - sum(li))) # 畫圖 fig = plt.figure(1) ax = fig.add_subplot(111) fig.set_size_inches(len(li), max(li)) left = list(range(len(li))) plt.bar(left=left, height=result, width=0.95, color='b', alpha=0.2) plt.bar(left=left, height=li, width=0.95, color='g', alpha=1) plt.xticks(list(range(0, len(li), 1))) plt.yticks(list(range(0, max(li) + 2, 1))) plt.show()

輸出結果:

[0, 1, 1, 2, 2, 2, 2, 3, 2, 2, 2, 1]
雨水的面積: 6

收集雨水問題

修改一下li的值:

li = [0, 1, 0, 2, 1, 0, 1, 4, 2, 3, 1, 2]

輸出結果:

[0, 1, 1, 2, 2, 2, 2, 4, 3, 3, 2, 2]
雨水的面積: 7

收集雨水問題

相關推薦

Python收集雨水問題給定n整數表示直方圖方柱高度同時每個方柱寬度定都1使用這樣形狀容器收集雨水可以多少水量

收集雨水問題 給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量? 如輸入:0,1,0,2,1,0,1,3,2,1,2,1;返回6。 題目來源 分析思路:

python入門指南控制語句

pan else pre 循環 clas python continue break for 條件控制 if,if-else,if-elseif-else #!/bin/python a = ‘test‘ if a == ‘test‘: print

python入門指南常用資料結構

Python內建了三種高階資料結構:list,tuple,dict list:陣列,相同型別的元素組成的陣列 tuple:元組,相同型別的元素組成的陣列,但是這裡有限定條件(長度是固定的,並且值也是固定的,不能被改變) dict:字典,k-v結構的   list陣列 1,初始化和遍歷li

python爬蟲篇python使用psycopg2批量插入資料(三)

本人菜雞,有什麼錯誤,還望大家批評指出,最近在更新python的爬蟲系列,○( ^皿^)っHiahiahia… 該系列暫時總共有3篇文章,連線如下 【python】爬蟲篇:python連線postgresql(一):https://blog.csdn.net/lsr40/article/de

python爬蟲篇python對於html頁面的解析(二)

我,菜雞,有什麼錯誤,還望大家批評指出!! 前言: 根據自己寫的上一篇文章,我繼續更第二部分的內容,詳情請點選如下連結 【python】爬蟲篇:python連線postgresql(一):https://blog.csdn.net/lsr40/article/details/833118

python爬蟲篇python連線postgresql(一)

本文記錄一下最近在做的事情,會把思考過程和解決問題的方案寫出來。當然,由於本人技術有限,所以可能並不是最好的方案,還請大家見諒!(黑貓白貓只要抓到老鼠,不就是好喵?~) 前言: 事情是這樣的,有一些文章,我要根據文章內容做分類,具體怎麼分我會單獨開一篇文章來講這件事情,這篇文章的重點不是分類

python報錯TypeError: 'builtin_function_or_method' object is unsubscriptable的解決方法

出現這個報錯的原因其實很簡單,就是將小括號'()'寫成了中括號‘[]' 下面來看一個例子: 當一個字典裡面嵌套了字典和列表的時候,再通過字典多層呼叫,將get函式後的小括號寫成了中括號。如下面程式碼第二行: 1.def lookup(data,label,name):

python裝飾器聽了N次也沒印象讀完這篇你就懂了

裝飾器其實一直是我的一個"老大難"。這個知識點就放在那,但是拖延症。。。 其實在平常寫寫指令碼的過程中,這個知識點你可能用到不多 但在面試的時候,這可是一個高頻問題。 ### 一、什麼是裝飾器 所謂的裝飾器,其實就是通過裝飾器函式,來修改原函式的一些功能,使得原函式不需要修改。 這一句話理解起來可能

給定空連結串列來表示整數位數按照逆序方式儲存它們的每個節點只儲存單個數字將兩數相加返回一個新的連結串列

題目描述: 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 思路: 1.定義連結串列類 2.建立兩個數的連結串列表示物件 3.傳入函式實現相加:每一位相加,設

給定一列整數,求這些數連線起來能組成的最大的數

題目是這樣的: 程式碼是這樣的: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scann

計算位數最高達300位的兩整數的乘積C語言程式設計實現

-------世界太蕪雜,我幫你整理---- -------C語言大數相乘運算---------- 今天我們要程式設計實現的是兩個超長整型資料進行相乘,並輸出結果 比如: 2134897427972647678 * 3497892374 我們先來看看執行效果

x+2y+3z=n整數解數

題目:給定一個正整數,範圍是,對於方程,其中,,為非負整數,求有多      少個這樣的三元組滿足此等式。 分析:本題最暴力的做法就是直接巢狀迴圈列舉,這樣時間複雜度很大,不可取。仔細想想,先看,

[南陽OJ-No.34]韓信點兵|相傳韓信才智過人從不直接清點自己軍隊的人數只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形而他每次只掠一眼隊伍的排尾就知道總人數了輸入3個非負整數a,b

南陽OJ-No.34 時間限制3000ms,記憶體限制65535KB,**難度1** 描述 相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數

Python給定一個數組A[0,…,n-1]求A的連續子陣列使得該子陣列的和最大

最大子陣列 給定一個數組A[0,…,n-1],求A的連續子陣列,使得該子陣列的和最大。 例如陣列: 1, -2, 3, 10, -4, 7, 2, -5 最大子陣列:3, 10, -4, 7, 2 演算法分析 定義:字首和sum[i

Python最長括號匹配問題給定字串僅包含左括號‘(’和右括號‘)’它可能不是括號匹配的設計演算法找出最長匹配的括號子串

最長括號匹配 示例: 給定字串,僅包含左括號‘(’和右括號‘)’,它可能不是括號匹配的,設計演算法,找出最長匹配的括號子串。 演算法分析 只有在右括號和左括號發生匹配時,才有可能更新最終解。 計算s[0…i]中左括號數目與右括號數目的差

Pythonselenium調用IE11瀏覽器報錯“找不到元素”NoSuchWindowException: MessageUnable to find element on closed window

conn ont csdn creates logs 註冊 target get 意思 當編寫自動化腳本,定位瀏覽器元素時,報如下錯誤: 代碼: >>> # coding=utf-8 >>> from selenium import w

蟲師講Selenium+Python第三講操作測試對象

最大 寬度 運行 sub alt mail rom baidu bdr 一、首先呢,選擇一個編輯器,我們這裏選擇的是Sublime Text >Ctrl+B為運行當前腳本的快捷方式 二、編寫代碼 1 #coding==utf-8 2 from selenium

pythonpython獲取當前日期前後N天或N月的日期

color ont mes form localtime col r+ arr nth 1 # -*- coding: utf-8 -*- 2 3 ‘‘‘獲取當前日期前後N天或N月的日期‘‘‘ 4 5 from time import strfti

Python學習筆記十三函數的參數對應

color 筆記 屏幕 *args borde 基於 但是 all small 位置傳遞 我們在定義函數時候已經對函數進行了參數傳遞調用,但是那只是粗淺的位置傳遞 示例 def sum(a,b,c): d = a+b+c return d p