前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 914. 卡牌分组

Leetcode 914. 卡牌分组

作者头像
zhipingChen
发布2019-12-19 21:25:19
4080
发布2019-12-19 21:25:19
举报
文章被收录于专栏:编程理解

题目描述

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

此时,你需要选定一个数字 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]

解法

由题目可知,若每组为 x 个数字,则需要将数组 arr 分为 len(arr)/x 个分组,每个分组内数字相同。

若已知每个数字对应出现的次数 cnt_i,则只需要找到一个数字 s,使得对于每个 cnt_i 都能整除 s

不妨由最小的次数 cnt_min 开始计算,不断降低 s,判断是否可以被所有 cnt_i 整除。

代码语言:javascript
复制
class Solution:
    def hasGroupsSizeX(self, deck: List[int]) -> bool:
        countset=set(collections.Counter(deck).values())
        minv=min(countset)
        if minv==1:
            return False
        i=1
        while i<=(minv//2):
            for v in countset:
                if v%(minv//i):
                    i+=1
                    break
            else:
                return True
        return False
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档