(Good topic)卡牌分組(3.27leetcode每日打卡)


給定一副牌,每張牌上都寫着一個整數。
此時,你需要選定一個數字 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
 
思路:1.如果規模小於等於2直接返回false
2.如果計數中有一個數字等於1,則也不能完成分組,返回false
3.再看示例5,四個二被分成了兩組,就知道應該要求數組中數字個數的最大公約數,根據最大公約數進行分組,這里利用遞歸求最大公約數。
 1 int gcd(int a, int b)
 2 {
 3     if(b == 0)
 4     {
 5         return a;
 6     }
 7     return gcd(b, a % b);
 8 }
 9 
10 bool hasGroupsSizeX(int* deck, int deckSize)
11 {
12     if(deckSize < 2)
13     {
14         return false;
15     }
16 
17     int *cnt = (int *)malloc(sizeof(int) * 10000);
18     for(int i = 0; i < deckSize; i++)
19     {
20         cnt[i] = 0;
21     }
22     for(int i = 0; i < deckSize; i++)  //計數
23     {
24         cnt[deck[i]]++;
25     } 
26     
27     int x = cnt[deck[0]];
28 
29     for(int i = 0; i < 10000; i++)
30     {
31         if(cnt[i] == 1)  //如果碰到1
32         {
33             return false;
34         }
35 
36         if(cnt[i] > 1)
37         {
38             x = gcd(x, cnt[i]);
39 
40             if(x == 1) //如果公約數出現一就說明沒有一個固定的x,也不能分組
41             {
42                 return false;
43             }
44 
45         }
46     }
47     return true;
48 }

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM