拥有最多糖果的孩子

LeetCode每日一题,1431.Kids With the Greatest Number of Candies

先看题目描述

题目大意就是 candies 数组代表每个孩子拥有的糖果数量,还有一个整数 extraCandies 代表可用于分配的额外糖果,让我们对每个孩子核查是否有一个分配额外糖果的方式,使得该孩子拥有的糖果数量最多,可以有多个孩子拥有最多的糖果

算法和思路

这道题很简单,要判断某个孩子是否能有最多糖果,直接把所有的额外糖果分配给他,然后去判断就行。我们只需求出 candies 数组的最大值 max,对于每个孩子,a他拥有的糖果数量加上额外糖果后与 max 比较,若大于等于 max,则存在满足条件的分配方式,否则不存在,这个思路很容易想到

代码也很容易实现,但在具体实现时发现了一个有趣的问题,一开始求 max 时使用的是java自带的函数Arrays.stream(candies).max().getAsInt(),但发现代码执行速度较慢,执行用时花了3ms,然后用遍历 candies 数组的方法求最大值,发现代码执行用时仅用了1ms,看来以后遇到类似求最大值的情况自己用遍历的方法实现效率会高些,个人猜测第一个方法求最大值速度较慢的原因是涉及到了数组的转换

下面是两个方法分别实现的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;

class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> res = new ArrayList<>();
if (candies.length == 0) return res;
int max = Arrays.stream(candies).max().getAsInt();
for (int candy: candies) {
if (candy + extraCandies >= max) res.add(true);
else res.add(false);
}
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;

class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> res = new ArrayList<>();
if (candies.length == 0) return res;
int max = 0;
for (int candy: candies) {
max = Math.max(max, candy);
}
for (int candy: candies) {
if (candy + extraCandies >= max) res.add(true);
else res.add(false);
}
return res;
}
}