来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
题目
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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
先排序,然后求相同数的个数 的 最大公约数。
方法
func getSameNum(num1: Int, num2: Int) -> Int {
if num1 == 1 || num2 == 1 {
return 0
}
if num1 == num2 {
return num1
}
var maxNum = max(num1, num2)
var minNum = min(num1, num2)
while maxNum - minNum > 1 {
let modNum = maxNum % minNum
if modNum == 0 {
return minNum
}
if modNum == 1 {
return 0
}
maxNum = max(modNum, minNum)
minNum = min(modNum, minNum)
if maxNum % minNum == 0 {
return minNum
}
}
return 0
}
func hasGroupsSizeX(_ deck: [Int]) -> Bool {
if deck.count < 2 {
return false
}
//先排序
let deckSort = deck.sorted()
var sameNum = 0
var X = 0
var currentNum = deckSort[0]
//然后找出一样的值
for num in deckSort {
//如果值相等,sameNum+1
//如果值不相等,判断sameNum 是否>=2。并判断X%sameNum是否=0
if num == currentNum {
sameNum += 1
}else {
if X == 0 {
X = sameNum
}
if sameNum < 2 {
return false
}
X = getSameNum(num1: X, num2: sameNum)
if X == 0 {
return false
}
sameNum = 1
currentNum = num
}
}
if X == 0 || X == sameNum {
return true
}
return (getSameNum(num1: X, num2: sameNum) == 0) ? false : true
}