LeetCode 每日一題 1431. 擁有最多糖果的孩子

1. 題目

1431. 擁有最多糖果的孩子

2. 描述

給你一個數組 candies 和一個整數 extraCandies ,其中 candies[i] 代表第 i 個孩子擁有的糖果數目。

對每一個孩子,檢查是否存在一種方案,將額外的 extraCandies 個糖果分配給孩子們之後,此孩子有 最多 的糖果。注意,允許有多個孩子同時擁有 最多 的糖果數目。

示例 1:

輸入:candies = [2,3,5,1,3], extraCandies = 3
輸出:[true,true,true,false,true]
解釋:
孩子 1 有 2 個糖果,如果他得到所有額外的糖果(3個),那麼他總共有 5 個糖果,他將成爲擁有最多糖果的孩子。
孩子 2 有 3 個糖果,如果他得到至少 2 個額外糖果,那麼他將成爲擁有最多糖果的孩子。
孩子 3 有 5 個糖果,他已經是擁有最多糖果的孩子。
孩子 4 有 1 個糖果,即使他得到所有額外的糖果,他也只有 4 個糖果,無法成爲擁有糖果最多的孩子。
孩子 5 有 3 個糖果,如果他得到至少 2 個額外糖果,那麼他將成爲擁有最多糖果的孩子。
示例 2:

輸入:candies = [4,2,1,1,2], extraCandies = 1
輸出:[true,false,false,false,false]
解釋:只有 1 個額外糖果,所以不管額外糖果給誰,只有孩子 1 可以成爲擁有糖果最多的孩子。
示例 3:

輸入:candies = [12,1,12], extraCandies = 10
輸出:[true,false,true]

3. 思路

  1. 要判斷加上額外糖果數後,該孩子能夠擁有最多的糖果,首先需要求出當前孩子中擁有最多的糖果數,此處利用 getMax() 方法來獲得當前孩子中最多的糖果數
  2. 然後將每個小孩糖果數+額外糖果數後與先前最大值比較
  3. 若相加後的糖果數不少於先前最大值,則說明該孩子可以有最多的糖果,否則則沒有
  4. 將判斷後的結果加入結果列表中
  5. 時間複雜度主要是獲取最大值的 O(n)O(n),然後是後邊的遍歷操作 O(n)O(n),總的時間複雜度則爲 T(n)=2O(n)=O(n)T(n) =2O(n)=O(n)

4. 實現

public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
    // 最終返回結果
    List<Boolean> result = new ArrayList<>();

    // 獲取數組最大值
    int max = getMax(candies);

    // 遍歷數組,然後將每個小孩糖果數+額外糖果數後與先前最大值比較
    // 若不小於先前最大值,則說明該孩子有最多的糖果
    for (int candy : candies) {
        boolean tmp = false;
        if ((candy + extraCandies) >= max) {
            tmp = true;
        }
        result.add(tmp);
    }

    return result;
}

/**
* @param arr
* @return 數組中最大的值
* @description 找數組中最大的值
* @date 2020/6/28 15:43
* @author cunyu1943
* @version 1.0
*/
public int getMax(int[] arr) {
    int max = 0;
    for (int value : arr) {
        if (value > max) {
            max = value;
        }
    }
    return max;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章