iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
Modern Web

後端攻略筆記系列 第 20

Day 20 : Go語言練習- LeetCode 1732 找最高海拔

  • 分享至 

  • xImage
  •  

標題:

LeetCode 1732 找最高海拔

接下來幾天,來學點不一樣,把之前學過的概念,應用在實際例子跟解題上面!!

題目來源:LeetCode 1732

內容:

想像有一個騎腳踏車的人,從海拔 0 公尺的地方開始騎。他騎的路上,有上坡也有下坡。每一段路,海拔都會有高有低,有時會升高,有時會下降。你知道怎麼找他這次騎行中,最高的那個海拔點是多少嗎?

這就是 LeetCode 1732 題的問題!題目告訴我們:「每一段路的海拔變化是多少」,然後我們要算出從頭騎到尾他騎到過的最高海拔。

怎麼做呢?
很簡單!
我們可以從最開始的海拔 0 開始,然後累加每一段路的高度差。例如,如果第一段上升了 5 公尺,我們現在就在海拔 5;下一段下降了 3 公尺,現在是海拔 2;再下一段上升了 4 公尺,現在是 6……
每算一次新的海拔,我們就記錄下目前的最高海拔是多少。
等騎完所有路段後,最高的海拔就是答案。

這題的重點在「累加」和「比較最大值」,很像我們平常数学裡的「累計和」概念,記錄之前的總和,然後找最大值。用程序寫的時候,只要用一個迴圈從頭走到尾,不斷累加並更新最大海拔,一下子就能算出答案。

*而且這個問題還有更多有趣的變化:

  • 假如騎腳踏車的人起點海拔不是 0,而是別的數字,怎麼辦?答案是把一開始的海拔改成那個數字,然後再累加。
  • 不只找最高海拔,如果我們還想找最低海拔,或者最大海拔和最低海拔之間的差距,也都很容易做到。
  • 還可以找最高海拔第一次出現在哪個位置,讓我們知道最高點在哪裡。*

這題雖然看起來很簡單,但背後幫助我們理解「累加」、「最大值更新」這兩個重要的程式思維,對學習程式和解題很有幫助。更棒的是,它和我們日常生活的騎車爬坡很有關聯,讓抽象的程式題活起來,變得有趣又好懂!

總之,只要記住這兩點:

  1. 從起點開始,逐步加上每段路的海拔變化。
  2. 每次計算後,看看是不是比目前的最高海拔還高,有就更新。

就能輕鬆找到最高海拔,成為騎行的高手啦!

試著動手寫寫看代碼,或者做做筆算練習,相信你一定能輕鬆掌握這個小技巧,未來面對類似「累計」和「最大值」的問題,也會更有信心!

挑戰:

條件限制:
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
}

上一篇
Day 19 :【Go 練習題】用 for...range 幫助小偵探統計「神秘盒子」裡的寶藏
系列文
後端攻略筆記20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言