來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
題目
給定一副牌原朝,每張牌上都寫著一個整數。
此時镶苞,你需要選定一個數字 X喳坠,使我們可以將整副牌按下述規(guī)則分成 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
}
image.png