每周一题:分糖果(更新JS)

题目:

给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

示例 1:

输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。
最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。
示例 2 :

输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
注意:

数组的长度为[2, 10,000],并且确定为偶数。
数组中数字的大小在范围[-100,000, 100,000]内。

 

通过结果:

每周一题:分糖果(更新JS)

 

代码:

var distributeCandies = function(candies) {
    let len=candies.length;
    let result;//妹妹获得糖果最多的种类
    let nums=Array.from(new Set(candies));
    if(nums.length>len/2){
        result=len/2;
        return result;
    }
    if(nums.length<=len){
        result=nums.length;
        return result;
    }
};

 

思路:

这道题目最终目的是输出妹妹能拿到的最多糖果种类数目。

由题目所给的示例可以知道,相同种类的糖果很可能不止一个,比如candies数组为[1,2,2,3,4,4],而不论糖果种类多少,两个人分到的糖果数量始终相等,即数组长度的平均数;在这种情况下,我们就需要想办法知道数组内是否有重复的数组存在。

在这里我用的是Array.from(new Set(array))方法,array代指各种数组,这是一种数组查重方法,举一个例子,假如数组为[1,1,2,3,4,4],查重后得到的数组就变成了[1,2,3,4];除此之外还有别的查重方法,如遍历循环数组等。在拿到查重完毕的数组长度,即糖果种类的数量后,我们就可以考虑如何得出妹妹的糖果种类了。

妹妹需要在数量平均分配的情况下尽可能的拿到种类足够多的糖果,设查重前数组长度为a,查重后数组长度为b,我们可以知道妹妹最终能拿到的糖果数量为a/2,当b>(a/2)或者b=(a/2)时,妹妹能拿到的最多种类只能是a/2,不可能再多。而当b<(a/2)时,则妹妹拿走所有不重复的糖果(可能会由重复的),所得种类最多只能是b。

在这里等号无论是在哪一种情况下都是成立的,所以放置在哪种情况下都可以,全看个人喜好。

这道题最终的种类分配我自己是在分两种情况举例后得出来的,但后来还是找出了里面分配糖果时存在的规律,毕竟论证不能依靠举例证明,需要严谨性。

这道题还有差不多的一种方法,代码如下:

var distributeCandies = function(candies) {
const candiesType = new Set(candies).size; // 糖果总种类
return Math.min(candiesType, (candies.length / 2 | 0));
};

通过率如下:

每周一题:分糖果(更新JS)

看起来内存消耗方面仍然是一个难题,执行用时倒是提升了一点。

每周一题:分糖果(更新JS)

上一篇:httprunner 2.x学习1-环境与登录接口案例


下一篇:JSP显示新闻