LeetCode - 1431. 拥有最多糖果的孩子 - 【数组 - 简单 - Java】

题目描述:

在这里插入图片描述
在这里插入图片描述

题目分析:

把额外的糖果分别给每个小盆友,这个小盆友能成为拥有糖果数最多的小盆友吗?题目很简单,所以这个题目分析就是凑一下字数啦。

题解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效率问题的分析博文,敬请期待~(还是不要期待吧,万一我忘记了呢)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值