1431. Kids With the Greatest Number of Candies

練習日期:2026-01-09

難度:Easy

類型:Array

📘 題目敘述

給定一個整數陣列 candies,其中 candies[i] 表示第 i 個小孩目前擁有的糖果數量,以及一個整數 extraCandies

對於每一個小孩,請判斷:

如果把 extraCandies 全部給這個小孩,他是否能成為「糖果數量最多的小孩(可並列)」。

請回傳一個布林陣列,對應每個小孩的結果。

條件限制

  • 2 ≤ candies.length ≤ 100
  • 1 ≤ candies[i] ≤ 100
  • 1 ≤ extraCandies ≤ 50

🧠 解題思路

我的想法很直接,把題目拆成兩個步驟來看:

  1. 先找出目前所有小孩中,糖果數量的最大值
  2. 再逐一檢查:如果某個小孩拿到 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/

作者: scottnick
撰寫日期: 2026-01-09
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/1431-kids-with-the-greatest-number-of-candies.html