我們可以在箱子中每個固定單位樹立隔板,但只能立兩個隔板,在不同位置樹立的隔板高度都有所不同,在這些限制下算出能夠容納最大水量
Input: [1,8,6,2,5,4,8,3,7] //不同位置擋板的高度
Output: 49
先準備好隔板高度 (數字陣列) ,迴圈起始值 (start),迴圈終止值 (bottom) , 水的容量 (higher_volumn) ,
input= [1,8,6,2,5,4,8,3,7]
def max_water_volumn(input)
start = 0
bottom = input.length-1
higher_volumn = 0
end
大小迴圈,因為是要算面積,所以隔板不可能在同樣的位置,我改變了小迴圈的起始值,讓小迴圈取值比大迴圈前面
def max_water_volumn(input)
start = 0
bottom = input.length-1
higher_volumn = 0
for i in [*start..bottom]
new = start + 1
for j in [*new..bottom]
end
end
higher_volumn
end
p max_water_volumn(input)
從數列中取兩個數找最小值,用i與j得到長度,算出容量
def max_water_volumn(input)
start = 0
bottom = input.length-1
higher_volumn = 0
for i in [*start..bottom]
new = start + 1
for j in [*new..bottom]
height = [input[i],input[j]].min
length = (j-i).abs
now_volumn = length*height
end
end
higher_volumn
end
最後把每次算出的容量與目前最大容量相比,如果目前容量大,就把最大容量改成目前容量
完整的code
input= [1,8,6,2,5,4,8,3,7]
def max_water_volumn(input)
start = 0
bottom = input.length-1
higher_volumn = 0
for i in [*start..bottom]
new = start + 1
for j in [*new..bottom]
height = [input[i],input[j]].min
length = (j-i).abs
now_volumn = length*height
if higher_volumn <= now_volumn
higher_volumn = now_volumn
end
end
end
higher_volumn
end
p max_water_volumn(input)
result 49
def max_area(heights = [])
max, start_at, end_at = [0, 0, heights.length - 1]
while start_at < end_at
width = end_at - start_at
high = 0
if heights[start_at] < heights[end_at]
high = heights[start_at]
start_at += 1
else
high = heights[end_at]
end_at -= 1
end
temp = width * high
max = temp if temp > max
end
max
end
作者利用 pattern matching 的方式指派變數,max(最大容量)先指派為0,start_at(左側擋版)的箭頭設定0,end_at(右側擋版)的箭頭設定陣列長度-1
設一個while迴圈,當 start_at 比 end_at 就繼續做
寬度就是用 end_at 扣掉 start_at,座標頭尾相扣得長度
做個 if 判斷, 把 start_at 與 end_at 當作索引 (index) 去取值,比較取出來的值大小,用 start_at 取出來的值比較小的話,就用它當作高度, start_at 就 +1 向右移動,反之一樣
最後計算容量,比較每次計算後的大小,把大的保留
作者大大不愧是大大,真是個聰明的想法
今天到此為止,有任何問題請在下方留言或透過email、GitHub聯絡我,感謝閱讀
Daily kitty