📘 題目敘述
給定一個整數陣列 candies,其中 candies[i] 表示第 i 個小孩目前擁有的糖果數量,以及一個整數 extraCandies。
對於每一個小孩,請判斷:
如果把 extraCandies 全部給這個小孩,他是否能成為「糖果數量最多的小孩(可並列)」。
請回傳一個布林陣列,對應每個小孩的結果。
條件限制
2 ≤ candies.length ≤ 1001 ≤ candies[i] ≤ 1001 ≤ extraCandies ≤ 50
🧠 解題思路
我的想法很直接,把題目拆成兩個步驟來看:
- 先找出目前所有小孩中,糖果數量的最大值
- 再逐一檢查:如果某個小孩拿到
extraCandies之後,糖果數量是否能「達到或超過」這個最大值
只要能達到,就代表這個小孩「有可能成為糖果最多的人」。
所有變數
candies:每個小孩目前擁有的糖果數extraCandies:可以額外給某一個小孩的糖果數max:目前所有小孩中,最大的糖果數量great:結果用的布林陣列,true / false對應每個小孩
🪜 主要流程步驟
步驟一:找出目前的最大糖果數
for (int i = 0; i < candies.size(); i++) {
if (candies[i] > max) {
max = candies[i];
}
}
這個迴圈的作用是:
- 掃描整個 candies 陣列
- 找出目前所有小孩中,糖果數量的最大值
- 這個 max 會作為後續比較的標準
步驟二:逐一判斷每個小孩是否能達到最大值
for (int j = 0; j < candies.size(); j++) {
if (candies[j] + extraCandies >= max) {
great.push_back(true);
} else {
great.push_back(false);
}
}
對每一個小孩:
- 假設把 extraCandies 全部給他
- 檢查
candies[j] + extraCandies是否大於等於 max - 是 → true
- 否 → false
這樣可以保證:
- 不需要真的修改 candies
- 只是在「假設情況下」做判斷
為什麼這樣做是正確的?
- 題目允許「並列最多」
- 所以判斷條件是
>= max,而不是一定要大於 - 先找最大值,再統一比較,邏輯清楚也避免重複計算
💻 程式碼實作
class Solution {
public:
vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {
int max = 0;
vector<bool> great;
for (int i = 0; i < candies.size(); i++) {
if (candies[i] > max) {
max = candies[i];
}
}
for (int j = 0; j < candies.size(); j++) {
if (candies[j] + extraCandies >= max) {
great.push_back(true);
} else {
great.push_back(false);
}
}
return great;
}
};
🔗 題目連結
https://leetcode.com/problems/kids-with-the-greatest-number-of-candies/