575. Distribute Candies

本文探讨了如何将一组糖果平均分配给两个人的问题,通过使用boolean数组来记录已遇到的糖果种类,从而得出妹妹能获得的最大种类数量。

问题描述:给你一个长度为偶数的数组,数组长度为 [2, 10,000]。其中数字范围为 [-100,000, 100,000],每个数字代表不同种类的糖果。将糖果分成数量均等的两份,妹妹最多能得到多少种糖果。
思路:想了半天,终于明白这题其实很简单,妹妹得到的糖果种类数为(糖果种类数,最多糖果数)两者的最小值。
原答案:

    public int distributeCandies(int[] candies) {
        int[] numRecord=new int[200001];
        int length=candies.length;
        int goalNum=length/2;
        int kinds=0;
        for(int i=0;i<length;i++){
            if(numRecord[candies[i]+100000]==0){
                numRecord[candies[i]+100000]++;
                kinds++;
            }
        }
        if(kinds>=goalNum)
            return goalNum;
        else
            return kinds;
    }

最佳答案:

    public int distributeCandies(int[] candies) {
        boolean[] seen = new boolean[200001];
        int ct = 0;
        int half = candies.length/2;
        for (int i = 0; i < candies.length && ct < half; i++) {
            int inx = candies[i] + 100000;
            if (!seen[inx]) {
                ct++;
                seen[inx] = true;
            }
        }
        return Math.min(ct, candies.length/2);
    }

没有必要使用数字数组记录糖果的数量,使用boolean数组可以简化判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值