leetcode-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 <= deck.length <= 10000 0 <= deck[i] < 10000
思考
計算兩個數 a, b 的最大公約數
-
**a =
c
* b + ****d **
- d = 0 a = c * b
-
**d > 0 a = c * b + d *
->b = ed + f
- **f = 0 b = e * d <- a = c * ( e * d ) + **d
- f > 0 ** b = e * d + ****f ****<- a = c * ( e * d + f ) + d **
測試最大公約數
package main import "fmt" func GreatestCommonDivisor(a, b int) int { for b != 0 { return GreatestCommonDivisor(b, a % b) } return a } func main() { fmt.Println(GreatestCommonDivisor(6, 9)) // 3 fmt.Println(GreatestCommonDivisor(2, 8)) // 2 fmt.Println(GreatestCommonDivisor(2, 3)) // 1 }
Go實現
package main import ( "fmt" "math" ) func GreatestCommonDivisor(a, b int) int { // 定義求最大公約數的方法 for b != 0 { return GreatestCommonDivisor(b, a % b) } return a } func hasGroupsSizeX(deck []int) bool { // 1. 統計各個數出現的次數 m := make(map[int]int) min := math.MaxInt64 for _, v := range deck { if m[v] != 0{ m[v] += 1 } else { m[v] = 1 } } fmt.Println("min: ", min) // 2. 遍歷找出最小次數 for i, v := range m { fmt.Printf("數字:%d, 出現了 %d 次\n", i, v) if min > v { min = v } } fmt.Printf("各個數出現的最小次數:%d\n", min) // 3. 求次數與最小次數之間是否存在最大公約數 for _, v := range m { fmt.Printf("min=%d, 與 %d 之間的最大公約數是 %d\n", min, v, GreatestCommonDivisor(min, v)) if(GreatestCommonDivisor(min, v)<=1) { fmt.Println("false") return false } } fmt.Println("true") return true } func main() { a := []int{1,2,3,4,4,3,2,1} hasGroupsSizeX(a) }