原題:給定乙個整數陣列,假設元素都是厚為1的擋板,往裡面倒水,計算盛水的最大橫截面積。 演算法1思路:
實現思路:每次看到乙個元素,就往回看會增加多少積水
時間複雜度,每遍歷乙個元素都有可能回看所有已經出現的元素,所以是o(n^2)
def cal_water(array):
if not array: return 0
rtv, max_v = 0, array[0]
for idx, value in enumerate(array[1:]):
ridx = idx
local_max = array[ridx]
while value > local_max and local_max != max_v:
rtv += min(value, max_v) - local_max
ridx -= 1
local_max = max(local_max, array[ridx])
max_v = max(max_v, value)
return rtv
演算法2思路: 1.實現思路,找到最大元素,然後分北坡和南坡計算積水面積
2.時間複雜度nlogn
def south_area(arr, idx):
if idx <= 1:
return 0
i = idx - 1
south_index, south_max = i, arr[i]
while i >= 0:
if arr[i] > south_max:
south_index, south_max = i, arr[i]
i -= 1
rtv = 0
i = south_index
while i < idx:
rtv += south_max - arr[i]
i += 1
return rtv + south_area(arr, south_index)
def north_area(arr, idx):
if idx >= len(arr) - 1:
return 0
i = idx + 1
north_index, north_max = i, arr[i]
while i < len(arr):
if arr[i] > north_max:
north_index, north_max = i, arr[i]
i += 1
rtv = 0
i = north_index
while i > idx:
rtv += north_max - arr[i]
i -= 1
return rtv + north_area(arr, north_index)
def water_area(arr):
if len(arr) <= 1:
return 0
max_index, max_value = 0, arr[0]
for index, value in enumerate(arr):
if value > max_value:
max_index, max_value = index, value
return south_area(arr, max_index) + north_area(arr, max_index)
測試用例
for i in range(20):
array = random.sample(range(20), random.randint(1, 20))
print 'array: ', array
print 'cal_water: ', cal_water(array)
print 'water_area: ', water_area(array)
print '******************************==='
此處進行了10組資料的模擬,大家可以肉眼驗證其正確性 洛谷 P1318 積水面積
一組正整數,分別表示由正方體迭起的柱子的高度。若某高度值為x,表示由x個正立方的方塊迭起 如下圖,0 x 5000 找出所有可能積水的地方 圖中藍色部分 統計它們可能積水的面積總和 計算的是圖中的橫截面積。乙個立方體的位置,為乙個單位面積 如圖 柱子高度變化為 0 1 0 2 1 2 0 0 2 0...
洛谷P1318積水面積
講講思路 從雙向記錄兩邊到當前位置的最大的高度 設兩個陣列l i r i 分別記錄從前往後和從後往前到i位置的最大高度 然後在每個位置加上其能夠裝的水的量,見公式sum min l i r i hi i 當前位置水能裝的最大高度減去下面磚的高度即為當前位置能裝的水。上ac include const...
洛谷P1318 積水面積
一組正整數,分別表示由正方體疊起的柱子的高度。若某高度值為 x 表示由 x 個正立方的方塊迭起 如下圖,0 x 5000 找出所有可能積水的地方 圖中藍色部分 統計它們可能積水的面積總和 計算的是圖中的橫截面積。乙個立方體的位置,為乙個單位面積 如圖 柱子高度變化為 0 1 0 2 1 2 0 0 ...