题目描述:
题目分析:
把额外的糖果分别给每个小盆友,这个小盆友能成为拥有糖果数最多的小盆友吗?题目很简单,所以这个题目分析就是凑一下字数啦。
题解1:
(首先我自己的题解)思路是把额外的糖果分别给每个小盆友,然后再和所有小盆友原来的糖果数量比较,判断是否是最多的。
class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> result = new ArrayList<>();
for (int num : candies) {
num += extraCandies;
Boolean max = true;
for (int oldNum : candies) {
if (oldNum > num) {
max = false;
break;
}
}
result.add(max);
}
return result;
}
}
完全不动脑子的暴力解法,执行用时: 2 ms,内存消耗: 38.3 MB。
题解2:
(还是我自己的题解)这下稍微动动脑子,优化一下效率。思路是先找出原来拥有糖果最多的小盆友的糖果数量,然后把额为的糖果分别分给每个小盆友,并和原来的最多糖果数量比较。
class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> result = new ArrayList<>();
int oldMax = 0;
for (int i = 0; i < candies.length; i++) {
oldMax = Math.max(candies[i], oldMax);
candies[i] += extraCandies;
}
for (int newNum : candies) {
result.add(newNum >= oldMax);
}
return result;
}
}
看来脑子还是有用的嘛,效率提升了。执行用时: 1 ms,内存消耗: 38.2 MB。
题解1的时间复杂度为O(n^2),题解2的时间复杂度为O(n)。
简单举个栗子就是,比如有10个小盆友,题解1要循环10 X 10 = 100次,而题解2只需要循环2 X 10 = 20次(省略常数,那就是10次?)。
题解3:
(LeetCode用户:gua-niu-26)思路和题解2是一样的,之所以拿出来,是因为想说说Java 8的特性 Stream(代码第3行)。顺便附上Stream的介绍:Java 8 Stream | 菜鸟教程
class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
int max = Arrays.stream(candies).max().getAsInt();
List<Boolean> result = new ArrayList<>(candies.length);
for (int candy : candies) {
result.add((candy + extraCandies) >= max);
}
return result;
}
}
作者:gua-niu-26
链接:https://leetcode-cn.com/problems/kids-with-the-greatest-number-of-candies/solution/java-da-qia-by-gua-niu-26/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
执行用时: 2 ms,内存消耗: 38.6 MB。
从题解2和题解3的执行结果来看,for循环的效率比Stream效率高,但是这就是真相了吗?
其实不然,Stream和for循环的效率孰高孰低,有很多前辈都用自己的方法测试过,最后得出的一个大多数人都比较认同的结论是:
Stream并行流 >> for循环 ~= Stream串行流
在数据量很大的情况下,使用Stream效率更高,很容易转换为并行流,不需要自己代码去写多线程,而且代码很简洁。
好了,for循环和Stream的效率问题在这里简单说说就好,毕竟这也不是专门分析for循环和Stream效率问题的博文。
回到算法上,算法是为了解决实际问题的,所以在实际开发中如果有需要时,到底是用for循环还是Stream,就要结合实际业务场景,数据量,硬件条件、数据源、数据结构等情况来抉择。比如你在自己电脑上用Stream处理千万级数据量很快,啪的一下就好了,但是放到别人电脑上就慢了很多,完全有可能是因为你的电脑是8核16线程,而别人的电脑还是单核CPU(手动滑稽)。
最后再强调一下,上面对for循环和Stream的效率问题的分析并不是什么正经分析,只是刚好碰到了所以提一下,如果有不认同上述观点的盆友请轻喷。后面如果有时间我会写一篇附上自己测试方案、测试代码、测试数据等,更加严谨的,对for循环和Stream效率问题的分析博文,敬请期待~(还是不要期待吧,万一我忘记了呢)