其他系列文章導航
Java基礎合集
數據結構與算法合集設計模式合集
多線程合集
分布式合集
ES合集
文章目錄
其他系列文章導航
文章目錄
前言
一、題目描述
二、題解
三、代碼
四、復雜度分析
前言
這是力扣的1431題,難度為簡單,解題方案有很多種,本文講解我認為最奇妙的一種。
一、題目描述
給你一個數組?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]
提示:
2 <= candies.length <= 100
1 <= candies[i] <= 100
1 <= extraCandies <= 50
二、題解
暴力法
思路與算法:
本題個人覺得暴力解法最為直接,題目說求孩子有?最多?的糖果。
由此可見,我們得求出目前持有最多糖果的有幾顆。
將額外的?extraCandies
?個糖果分配給孩子們之后,此孩子有?最多?的糖果。
所以:
candy + extraCandies >?max
但是允許有多個孩子同時擁有?最多?的糖果數目。
candy + extraCandies >= max
所以先一次遍歷求出最大值,在進行一次遍歷求出是否此孩子有?最多?的糖果。
三、代碼
暴力法
Java版本:
class Solution {public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {List<Boolean> res = new ArrayList<>();int max = 0;for (int candy : candies) {if (candy > max) max = candy;}for (int candy : candies) {if (candy + extraCandies >= max) {res.add(true);} else {res.add(false);}}return res;}
}
C++版本:?
class Solution {
public:vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {vector<bool> res;int max = 0;for (int candy : candies) {if (candy > max) max = candy;}for (int candy : candies) {if (candy + extraCandies >= max) {res.push_back(true);} else {res.push_back(false);}}return res;}
};
Python版本:?
class Solution:def kidsWithCandies(self, candies: List[int], extraCandies: int) -> List[bool]:res = []max_candies = max(candies)for candy in candies:if candy + extraCandies >= max_candies:res.append(True)else:res.append(False)return res
四、復雜度分析
假設小朋友的總數為 n。
- 時間復雜度:我們首先使用 O(n) 的時間預處理出所有小朋友擁有的糖果數目最大值。對于每一個小朋友,我們需要 O(1) 的時間判斷這個小朋友是否可以擁有最多的糖果,故漸進時間復雜度為 O(n)。
- 空間復雜度:這里只用了常數個變量作為輔助空間,與 n?的規模無關,故漸進空間復雜度為 O(1)。