目前,你正在山頂,你累爆了,所以聰明的你會選擇會短的路下山,山坡都有不同的狀況,有的會耗費大量的體力才能通過,有的則可以輕鬆下去,每一個路口都會有兩條叉路,希望以最省體力的方式下山
input = [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
output = 11
用 y 來記錄高度,預設是 0 , x 紀錄走哪條小路,預設是 0 , total來紀錄消耗的體力
input = [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
output = 11
function lowPath(ary){
y = 0
x = 0
total = ary[y][x]
return total
}
function expect(a,b){
console.log(a==b)
}
expect(lowPath(input),output)
迴圈就以到達平底為終止,如果 ary[y+1] 沒有值就代表到平地
每次迴圈都會往山下走一段,所以用 y+=1 來表示高度變化
接著要比較哪一條路比較省體力,用ary[y][x] 與 ary[y][x+1] 來取值,用這種方式是因為觀察過後,發現選擇左邊的路 x 不會變化,選右邊的路 x 會 +1,將體力加總,當到達平地後把總體力消耗回傳
input = [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
output = 11
function lowPath(ary){
y = 0
x = 0
total = ary[y][x]
while(!!ary[y+1]){
y+=1
if(ary[y][x]<ary[y][x+1]){
total += ary[y][x]
}else{
total +=ary[y][x+1]
x+=1
}
}
return total
}
function expect(a,b){
console.log(a==b)
}
expect(lowPath(input),output)
這樣的寫法有可能會遇到錯誤,雖然每一次都在岔路選擇走體力消耗小的路,但是加總起來不一定是體力消耗最小的結果
為了解決這個問題,需要將體力消耗可能的結果都存下,每一次都做比較
function lowPath(ary){
let y = ary.length - 1
let result = []
for(let i = 0 ; i < ary.length; i++){
result.push([])
}
result[y] = ary[y]
for(let j = y; j > 0; j-- ){
for(let k = 0; k < ary[j].length-1; k++){
item = Math.min( result[j][k] , result[j][k+1] ) + ary[j-1][k]
result[j-1].push(item)
}
}
console.log(result)
return result[0][0]
}
function expect(a,b){
console.log(a==b)
}
expect(lowPath(input),output)
今天到此為止,有任何問題請在下方留言或透過email、GitHub聯絡我,感謝閱讀
Daily kitty