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 <= 100000 <= deck[i] < 10000
要完成的函数:
bool hasGroupsSizeX(vector<int>& deck)
说明:
1、这道题给定一个vector,vector中存放着卡牌的数字,比如1、2、3、4这样子,你需要把这些卡牌分成多组。
要求同一组中的卡牌数字一致,并且每一组中的卡牌张数一样。
比如123321,你就可以分成[1,1],[2,2],[3,3]。
如果可以这样分组,并且组中卡牌张数大于等于2,那么返回true,否则返回false。
限制卡牌数字在[0,10000),vector中的卡牌张数在[1,10000]。
2、我们最开始可以用vector也可以用map,来存放各个数字的卡牌各有多少张。
(笔者一开始的错误想法:这里用先排序后遍历的做法,有点傻,因为排序O(nlogn)的时间复杂度太高了,还不如直接遍历。)
得到各个数字卡牌的张数之后,我们需要看一下是否可以分组。
这里有个地方要注意下,比如卡牌1有4张,卡牌2有6张,是否可以分组呢?
可以的,每组2张就可以了,卡牌1有2组,卡牌2有3组。
也就是说,我们要求各种数字卡牌的张数的最大公约数,看一下最大公约数是否大于等于2。
而不能简单地看各种数字卡牌的张数是否一致。
但是求集体的最大公约数太麻烦了,还不如直接从2开始,判断所有数字可不可以整除2。
如果可以,那么返回true。如果不行,看一下是否可以整除3……
继续判断,一直到最小的张数。
代码如下:(附详解)
bool hasGroupsSizeX(vector<int>& deck)
{
unordered_map<int,int>m1;//用不排序的map来记录,节省排序的时间
for(int i:deck)//把每种卡牌的张数记录在map中
m1[i]++;
bool flag;
int min1=INT_MAX;//min1用来存放最小的张数
for(unordered_map<int,int>::iterator iter=m1.begin();iter!=m1.end();iter++)
min1=min(min1,iter->second);
for(int i=2;i<=min1;i++)//从2开始判断,一直到最小的张数
{
flag=0;
for(unordered_map<int,int>::iterator iter=m1.begin();iter!=m1.end();iter++)//遍历map,判断张数能不能整除2、3、4……
{
if(iter->second%i!=0)//如果不能整除,那么break出去,换下一个整数继续遍历判断
{
flag=1;
break;
}
}
if(flag==0)//如果遍历了一遍,都可以整除,那么返回true
return true;
}
return false;//如果尝试了各种数字,都不能整除,那么返回false。
}
上述代码实测8ms,beats 99.48% of cpp submissions。
这道题的一个启示是:如果要求很多数字的集体公约数,可以从2开始,逐个(可以的话用质数,更快)判断能不能整除,如果某个数字大家都能整除,那么就是集体公约数。
笔者最开始的想法是用辗转相除法求出前两个数的最大公约数a,接着再求第二个数和第三个数的最大公约数b,然后求a和b的最大公约数,记为a,
接着再求第三个数和第四个数的最大公约数b,然后求a和b的最大公约数,记为a……
不断循环下去,求得所有数的最大公约数,看会不会大于等于2。
这样做似乎也可以,但是有点麻烦,之后可以尝试一下。
leetcode-914-卡牌分组的更多相关文章
- leetcode 签到 914. 卡牌分组
题目 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X ...
- leetcode(js)算法之914卡牌分组
给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X > ...
- Leetcode914.X of a Kind in a Deck of Cards卡牌分组
给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X > ...
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- leetcode《按递增顺序显示卡牌》
题目描述: 牌组中的每张卡牌都对应有一个唯一的整数.你可以按你想要的顺序对这套卡片进行排序. 最初,这些卡牌在牌组里是正面朝下的(即,未显示状态). 现在,重复执行以下步骤,直到显示所有卡牌为止: 从 ...
- 使用UIKit制作卡牌游戏(三)ios游戏篇
译者: Lao Jiang | 原文作者: Matthijs Hollemans写于2012/07/13 转自朋友Tommy 的翻译,自己只翻译了这第三篇教程. 原文地址: http://www.ra ...
- [Swift]LeetCode950. 按递增顺序显示卡牌 | Reveal Cards In Increasing Order
In a deck of cards, every card has a unique integer. You can order the deck in any order you want. ...
- TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变
转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...
- BZOJ 4205: 卡牌配对
4205: 卡牌配对 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 173 Solved: 76[Submit][Status][Discuss] ...
随机推荐
- Spring boot 默认静态资源路径与手动配置访问路径的方法
这篇文章主要介绍了Spring boot 默认静态资源路径与手动配置访问路径的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在application.propertis中配置 ##端口号 ...
- shell的一些简单用法
一 BASH的属性 BASH中会存储一些自身属性的参数,启用或关闭某一项功能 例如控制* .字符是否为通配 查看参数 set -o 关闭noglob参数 set -o noglob ls * ls: ...
- 2018.09.02 bzoj1025: [SCOI2009]游戏(计数dp+线筛预处理)
传送门 要将所有置换变成一个轮换,显然轮换的周期是所有置换长度的最小公倍数. 于是我们只需要求长度不超过n,且长度最小公倍数为t的不同置换数. 而我们知道,lcm只跟所有素数的最高位有关. 因此lcm ...
- * 结束Activity
public class MainActivity extends Activity { @Override public void onCreate(Bundle sav ...
- Spring 集成 MemCache
1)xml <bean class="com.danga.MemCached.SockIOPool" factory-method="getInstance&quo ...
- IOS11下fixed中input光标错位问题
项目遇到了这个问题,故作了个临时解决方案,暂时没有想到更好的方法,查阅了网上的方案,也没有找到完美的解决方案. 方案思路: ①弹窗打开时,阻止 body 滚动,禁用 touchmove ,同时记录当前 ...
- node.js+express+mongodb
主要是想用node.js链接mongodb,用的是mongoose.用ejs引擎,扩展到.html比较容易 小例子结构简单,框架清晰. 提交方法 路径 方法 作用 get add post a ...
- 集合(三)CopyOnWriteArrayList
第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在c ...
- zookeeper集群崩溃处理
今天在私有化项目中遇到如下问题: 1.客户反馈用户登录返回303 2.登录服务器查看是大量的log将服务器磁盘空间占用殆尽,导致所有服务进程仍旧存在但是监听端口失败,服务不可用 3.清理日志文件 4. ...
- ArgumentException: 已添加了具有相同键的项。
此问题出现在asp.net mvc 5 中,前端向后端请求数据,方法的参数是模型,比如 Add(Student m), 结果浏览器显示的状态是500并返回错误提示ArgumentException,如 ...