📋 U3 清單・知識點 K09

最大值與最小值

找出一串資料中的最大值和最小值

B3-03-MinMax
練習平台
點標題可以展開或收合

1學習目標

  • 會用「擂台法」一筆一筆比較,找出最大值和最小值。
  • 會安排最大值、最小值的初始值,並知道為什麼用第一筆資料最安全。
  • 會在同一個迴圈裡同時找最大值和最小值。
  • 會只在清單的某一段範圍內找最大值。

2概念說明

找最大值就像打擂台:先讓一個人站上擂台當「目前的冠軍」,接下來每個挑戰者都上來比一比,比冠軍大就換他當冠軍。所有人都比完,站在台上的就是最大值。

最大值 設為 (初始值)
每讀到一個數字:
    如果 數字 > 最大值:
        最大值 設為 數字
說出 最大值
8
3
12
7
10
目前的冠軍:8 → 8 → 12 → 12 → 12
只有遇到比冠軍大的數字,冠軍才會換人

初始值要設多少? 有兩種常見做法:

做法最大值的初始值優點要注意
用第一筆資料第 1 個數字一定正確迴圈要從第 2 個開始比
用一個極端的數例如 −999999寫法簡單,迴圈從第 1 個開始資料如果比這個數還小就會出錯

找最小值的方法完全一樣,只要把「>」換成「<」,極端的初始值換成很大的數(例如 999999)。

3示範題:跟著一步一步做(1 題)

先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。

示範題

找最大值

L2|進階EXT01-001
給定 N 個整數,請找出其中最大的數字。
輸入
第一個整數為 N,接著輸入 N 個整數。
輸出
輸出一個整數,代表最大值。
範例1
輸入
5
8 3 12 7 10
輸出
12
第 1 步:讀題,找出輸入和輸出
  • 輸入:N,接著 N 個整數。
  • 輸出:最大的數字。
第 2 步:把問題拆成步驟
詢問並等待 → N
最大值 設為 −999999
重複 N 次:
    詢問並等待 → 數字
    如果 數字 > 最大值:
        最大值 設為 數字
說出 最大值
第 3 步:用範例走一次

資料「8 3 12 7 10」:

讀到的數字比最大值大嗎?最大值
開始前-−999999
8是8
3否8
12是12
7否12
10否12

輸出 12。

第 4 步:對照範例答案

按「載入範例」,範例答案用的是「極端的初始值」做法(−999999),所以不需要清單,邊讀邊比就可以。

⚠️ 常見錯誤
  • 最大值的初始值設成 0:如果資料全部是負數(例如 −5、−2、−9),最大值會停在 0,答案就錯了。
  • 比較符號寫反:寫成「數字 < 最大值 就更新」,找到的會是最小值。

4練習題(3 題)

照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。

最大最小差距

L2|進階EXT01-003
這題多了什麼:在同一個迴圈裡放兩個「如果」:一個負責更新最大值,一個負責更新最小值。注意兩個「如果」是分開的,不要寫成「如果…否則…」,因為第一個數字可能同時需要更新兩者。
看題目內容
給定 N 個整數,請找出最大值與最小值,並計算兩者差距。
輸入
第一個整數為 N,接著輸入 N 個整數。
輸出
輸出三個整數,依序為最大值、最小值、差距,中間以空白分隔。
範例1
輸入
5
8 3 12 7 10
輸出
12 3 9
💡 需要提示嗎?
同一個迴圈裡同時更新最大值和最小值,最後再相減。

單筆資料時的最大最小值

L2|進階M1-12-06
這題多了什麼:這題只有一筆資料,最大值和最小值都應該是它自己。範例答案用的是「第一筆資料當初始值」的做法:先把資料存進清單,最大值和最小值都設為第 1 項,再從第 2 項開始比。只有一筆資料時,迴圈一次都不用跑,答案也是對的。
看題目內容
請你找出N筆分數中的最大值與最小值,並依序輸出。
輸入
N、N個分數
輸出
最大值 最小值
範例1
輸入
1
88
輸出
88 88
💡 需要提示嗎?
只有一筆資料時,最大值和最小值都是它自己。如果初始值用第 1 筆資料,就不會出錯。

區間最大值

L2|進階EXT01-008
這題多了什麼:找最大值的方法不變,只是範圍變成第 L 項到第 R 項。先把資料存進清單,最大值的初始值用第 L 項,迴圈從第 L+1 項比到第 R 項。
看題目內容
給定 N 個整數,以及查詢區間 L 到 R,請找出第 L 個到第 R 個數字中的最大值。位置從 1 開始計算。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入兩個整數 L 與 R。保證 1 <= L <= R <= N。
輸出
輸出一個整數,代表區間最大值。
範例1
輸入
6
5 8 3 12 7 10
2 5
輸出
12
💡 需要提示嗎?
找最大值的方法不變,只是迴圈改成從第 L 項跑到第 R 項,初始值也要用第 L 項。

5延伸挑戰(2 題)

核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。

🚀 第二高分 L3|挑戰
挑戰重點:要同時記住「第一名」和「第二名」。遇到比第一名大的數字時,原本的第一名要先退位成第二名,新數字再當第一名。另外,和第一名一樣大的分數不能算成第二名(範例有兩個 95,第二高分是 88)。
給定 N 位學生的成績,請找出最高分與第二高分。保證至少有兩種不同分數。
輸入
第一個整數為 N,接著輸入 N 個整數代表成績。
輸出
輸出兩個整數,依序為最高分與第二高分,中間以空白分隔。
範例1
輸入
6
70 95 80 95 60 88
輸出
95 88
💡 需要提示嗎?
同時記住「第一名」和「第二名」:遇到比第一名大的數,原本的第一名要退成第二名。分數相同的情況也要想清楚。
🚀 班服投票 L3|挑戰
挑戰重點:先用三個計數變數算出 1、2、3 號各得幾票,再用擂台法找出最高票數。最後還要數一數:有幾款的票數等於最高票?超過一款就輸出「請重新投票」。
可愛國小601班要製作紀念班服,本次班服設計共有3個款式,分別編號為1、2、3。 每位同學可在選票上寫下自己選擇的班服款式編號,最後以得票數最高者為班服樣式。 請先計算每款班服的得票數(依1→3順序),並輸出最高票的班服編號。 若有兩款或以上的票數相同且為最高票,則輸出:請重新投票
輸入
第一行:整數 N,代表投票數。 第二行:N 個整數(介於 1~3),代表每張選票的班服設計編號。
輸出
若票數最高者唯一,輸出該款式編號;若最高票出現同票數,輸出「請重新投票」。
範例1
輸入
8
1 2 2 3 2 1 3 2
輸出
2
範例2
輸入
6
1 2 3 1 2 3
輸出
請重新投票
💡 需要提示嗎?
先用三個計數變數算出每一款的票數,再找出最高票;最高票如果有兩款以上相同,要輸出「請重新投票」。

6自我檢核

學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。

  • 我能用擂台法說明找最大值的過程。
  • 我知道初始值用第一筆資料最安全,也知道用 0 當初始值可能出錯的情況。
  • 我會在同一個迴圈裡同時找最大值和最小值。
  • 我會只在清單的某一段範圍裡找最大值。