每日一题——LeetCode914

每日一题——LeetCode914_第1张图片

方法一  个人解法:

  1. 因为分组后每组里的数字要是相同的,所以先把有几种数字,每种数字有几张都统计出来用group数组保存,并同时记录最少的张数min。
  2. 按照要求每组至少要有2张牌,所以可以直接排除最少张数为1的。如果整副牌只有一种数字,并且张数大于等于2,那么就一定是满足的。
  3. 对于group数组我们只要能找到满足数组里所有张数的一个不为1的公因数m那么就能分成每组有m张牌的n个组,例如对于group=[ 4 , 6 ] ,4和6的公因数为2,那么就能分组成              [ 2,2,2,2,2 ],对于gruop  = [ 5 ,3 ],没有满足的公因数,那么就没有满足的分组
var hasGroupsSizeX = function(deck) {
    deck.sort((a,b)=>a-b)
     var count=1,group=[],min=999
    for(var i=0;i

消耗时间和内存情况:

每日一题——LeetCode914_第2张图片

思路是没问题的,但是代码写的有点臃肿复杂,需要优化一下:

var hasGroupsSizeX = function(deck) {
    let map = new Map()
    for(let n of deck){
        if(map.has(n)){
            map.set(n,map.get(n)+1)
        }else{
             map.set(n,1)
        }
    }
    let group = [...map.values()]
    let res = group[0]
    return group.every(i => (res = gcd(res, i)) > 1)

};

let gcd = (a, b) => (b === 0 ? a : gcd(b, a % b))

其实只需要统计各个数字的频次,求最大公约数是否大于1。

消耗时间和内存情况:

每日一题——LeetCode914_第3张图片

你可能感兴趣的:(每日一题,算法,javascript,leetcode)