给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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
这个题目我们简单翻译翻译,就是给你若干个数,然后求是否存在一个数,每个数都能整除它。求两个数的最大公约数,通常我们可以使用辗转相除法。求三个数的最大公约数,我们可以使用前两个数的最大公约数再跟第三个数进行辗转相除法求最大公约数。同理,N个数我们也可以求他们的最大公约数。
辗转相除法,又称欧几里得算法,他的算法复杂度我们可以近似地看成O(lgN)。但是我们仔细看下题目的数据范围,才1万张牌,说明最后不同的数也就大概sqrt(2万)不到150个。所以,既然数据范围这么少,我们为什么要*鸡用牛刀呢?这里讲一个面试中的套路,在面试中遇到算法题,问清楚数据范围,假如面试官没有说用最优的方法,我就用最简单的算法来做,保证代码万无一失。不出意外的话,面试官会问你有没有更优的解法,这个时候在balabala地说出来,假如面试官没有问,也可以主动提起,说我们的解法是基于数据规模的,我还有更优的解法,这些解法各自的优缺点是什么,适用于怎么样的数据场景。从而展示自己的问题考虑周全的一面。好了今天的题目就到这里,我们最后看下这种暴力写法吧。