LeetCode:914. 卡牌分组

题目描述:

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。

示例 1:

输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]


示例 2:

输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。


示例 3:

输入:[1]
输出:false
解释:没有满足要求的分组。


示例 4:

输入:[1,1]
输出:true
解释:可行的分组是 [1,1]


示例 5:

输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]

提示:

1 <= deck.length <= 10000
0 <= deck[i] < 10000

题目链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/

解题思路:

1.分类,计算出每类的个数;

2.得到最小类别个数,然后从 2 开始求最小约数。

题目答案:

var hasGroupsSizeX = function(arr) {
  let typeArr = [] // 数字类别
  let lenArr = [] // 每类数字出现的次数
  for (let i = 0, len = arr.length; i < len; i++) {
    const idx = typeArr.indexOf(arr[i])
    if (idx === -1) {
      // 不存在
      typeArr.push(arr[i])
      lenArr[typeArr.length - 1] = 1
    } else {
      // 存在
      lenArr[idx]++
    }
  }
  // 利用数组排序,求最小个数
  let min = lenArr.sort((a, b) => a - b)[0]
  // 类别中只存在一个的情况
  if (min < 2) return false
  // 从公约数 2 开始查找
  let yue = 2
  let isOk = false
  for (; yue <= min; yue++) {
    let j = 0, len = lenArr.length
    for (; j < len; j++) {
      if (lenArr[j] % yue !== 0) break // 不能整除
    }
    if (j === len) {
      // 当前公约数能整除
      isOk = true
      break
    }
  }
  return isOk
};

测试结果:

猜你喜欢

转载自blog.csdn.net/qq_39025670/article/details/104035292