Cool说丨力扣914

简介: 914.卡牌分组

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. 1 <= deck.length <= 10000
  2. 0 <= deck[i] < 10000

第一版,没想完全,还有其他情况

当 [1,1,1,1,2,2,2,2,2,2] 时,相当于 1:4  2:6,此时X为2的时候是可以的,也就是说要算,所有数量的共同最小公倍数,且最小公倍数要为X,X要大于等于2了

boolhasGroupsSizeX(vector<int>&deck) {

   unordered_map<int, int>res;

   for (auto&a : deck) {

       res[a] +=1;

   }

   intminCut= (*(res.begin())).second;

   for (autoit=++res.begin(); it!=res.end(); ++it) {

       minCut=min(minCut, (*it).second);

   }

   if (minCut<2) returnfalse;

   for (auto&a : res) {

       if (a.second%minCut!=0) returnfalse;//这里不能简单的判断当前值是否可以整除最小值

   }

   returntrue;

}

第二版,改进版本,好题目

执行用时 :16 ms, 在所有 cpp 提交中击败了92.34%的用户

内存消耗 :9.9 MB, 在所有 cpp 提交中击败了73.24%的用户

在运行过程中如果发现最小值小于2或者,当前次数与最小值的最大公约数为1的时候,就该直接返回了

intgreatestCommonDivisor(inta, intb) {

   intc=0;

   if (a<b) swap(a, b);

   while (true) {

       c=a%b;

       if (c==0) returnb;

       else

       {

           a=b;

           b=c;

       }

   }

}

boolhasGroupsSizeX(vector<int>&deck) {

   unordered_map<int, int>res;

   for (auto&a : deck) {

       res[a] +=1;

   }

   intminCut= (*(res.begin())).second, greatestCommonDivisoreNum=0;

   for (autoit=res.begin(); it!=res.end(); ++it) {

       greatestCommonDivisoreNum=greatestCommonDivisor(minCut, it->second);

       minCut=min(minCut, (*it).second);

       cout<<"leastCommonMultipleNum "<<greatestCommonDivisoreNum<<" minCut "<<minCut<<endl;

       if (minCut<2||greatestCommonDivisoreNum==1) returnfalse;

   }

   

   returntrue;

}


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
192 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
166 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
195 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
165 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
140 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
209 0
|
C#
Cool说丨力扣475
475. 供暖器
165 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
155 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
139 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
156 0