標題:
接下來幾天,來學點不一樣,把之前學過的概念,應用在實際例子跟解題上面!!
題目來源:LeetCode 1732
內容:
想像有一個騎腳踏車的人,從海拔 0 公尺的地方開始騎。他騎的路上,有上坡也有下坡。每一段路,海拔都會有高有低,有時會升高,有時會下降。你知道怎麼找他這次騎行中,最高的那個海拔點是多少嗎?
這就是 LeetCode 1732 題的問題!題目告訴我們:「每一段路的海拔變化是多少」,然後我們要算出從頭騎到尾他騎到過的最高海拔。
怎麼做呢?
很簡單!
我們可以從最開始的海拔 0 開始,然後累加每一段路的高度差。例如,如果第一段上升了 5 公尺,我們現在就在海拔 5;下一段下降了 3 公尺,現在是海拔 2;再下一段上升了 4 公尺,現在是 6……
每算一次新的海拔,我們就記錄下目前的最高海拔是多少。
等騎完所有路段後,最高的海拔就是答案。
這題的重點在「累加」和「比較最大值」,很像我們平常数学裡的「累計和」概念,記錄之前的總和,然後找最大值。用程序寫的時候,只要用一個迴圈從頭走到尾,不斷累加並更新最大海拔,一下子就能算出答案。
*而且這個問題還有更多有趣的變化:
這題雖然看起來很簡單,但背後幫助我們理解「累加」、「最大值更新」這兩個重要的程式思維,對學習程式和解題很有幫助。更棒的是,它和我們日常生活的騎車爬坡很有關聯,讓抽象的程式題活起來,變得有趣又好懂!
總之,只要記住這兩點:
就能輕鬆找到最高海拔,成為騎行的高手啦!
試著動手寫寫看代碼,或者做做筆算練習,相信你一定能輕鬆掌握這個小技巧,未來面對類似「累計」和「最大值」的問題,也會更有信心!
條件限制:
1.只可以用一個for迴圈去寫
2.一定要用兩個for迴圈,又要怎麼寫?
func findmaxheightSingleLoop(gain []int, originheight int) (maxheight int, minheight int, maxIndex int, minIndex int, diff int) {
maxheight = originheight
minheight = originheight
currentHeight := originheight
maxIndex = 0
minIndex = 0
for i, v := range gain {
currentHeight += v
if currentHeight > maxheight {
maxheight = currentHeight
maxIndex = i + 1
}
if currentHeight < minheight {
minheight = currentHeight
minIndex = i + 1
}
}
diff = maxheight - minheight
return
}
func findMaxMinHeightTwoLoops(gain []int, originheight int) (maxheight int, minheight int, maxIndex int, minIndex int, diff int) {
currentHeight := originheight
maxheight = originheight
minheight = originheight
maxIndex = 0
minIndex = 0
// 找最高海拔及首次出現索引
for i, v := range gain {
currentHeight += v
if currentHeight > maxheight {
maxheight = currentHeight
maxIndex = i + 1
}
}
currentHeight = originheight
// 找最低海拔及首次出現索引
for i, v := range gain {
currentHeight += v
if currentHeight < minheight {
minheight = currentHeight
minIndex = i + 1
}
}
diff = maxheight - minheight
return
}