Leetcode_Array --914. X of a Kind in a Deck of Cards [easy]
阿新 • • 發佈:2018-12-16
In a deck of cards, each card has an integer written on it. 在一副撲克牌中,每張牌上都寫了一個整數 Return true if and only if you can choose X >= 2 such that it is possible to split the entire deck into 1 or more groups of cards, where: Each group has exactly X cards. All the cards in each group have the same integer.
如果你能且僅能找到一個 X>= 2,使這些牌分成一組或多組牌,這些牌滿足如下規則: 每組牌都恰好含有X張卡片 每組卡片中的數都相同 那麼返回 true
Example 1:
Input: [1,2,3,4,4,3,2,1]
Output: true
Explanation: Possible partition [1,1],[2,2],[3,3],[4,4]
Example 2:
Input: [1,1,1,2,2,2,3,3]
Output: false
Explanation: No possible partition.
Example 3:
Input: [1] Output: false Explanation: No possible partition.
Example 4:
Input: [1,1]
Output: true
Explanation: Possible partition [1,1]
Example 5:
Input: [1,1,2,2,2,2]
Output: true
Explanation: Possible partition [1,1],[2,2],[2,2]
Note: 1、1 <= deck.length <= 10000 2、0 <= deck[i] < 10000
Solution: 這個演算法是要統計deck中所有元素出現的個數,元素出現個數最小的個數為整個元素出現個數的最大公約數,也就是說分成的組的元素個數最小從2開始,最大就到這個最大公約數。這樣我們就需要先統計元素出現個數,在找到deck中所有元素出現個數的最大公約數,然後遍歷從2到這個最大公約數,如果元素出現的個數對這個區間的某個數求餘都為0,表示可以按照這個數進行分組,則返回true,否則返回false。
Python
from collections import Counter
class Solution:
def hasGroupsSizeX(self, deck):
"""
:type deck: List[int]
:rtype: bool
"""
count = set(list(Counter(deck).values())) #統計deck元素出現個數
min_num = min(count) #每組的牌的個數最大應該到count中最小的那個數,所以遍歷從2到min_num,其實這個區間就是牌組中元素個數的公約數,查詢哪一個公約數合適
for i in range(2,min_num+1):
if all([ x%i == 0 for x in count]): #all函式中是一個迭代型別,判斷迭代的元素是否為真。在這裡表示這個公約數是否能夠使所有個數都對其求餘為0,滿足的話就返回True
return True
return False
C++
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int,int> Map;
for (auto i : deck){
Map[i]++; #首先記錄deck中元素出現的個數
}
int min_num = deck.size();
for (auto c:Map){
if (c.second < min_num){
min_num = c.second; #找到元素出現個數的最小值
}
for (int i =2;i<=min_num;i++){ #遍歷從2到這個最小值
int j = 0;
for (auto c:Map){ #如果Map中元素出現的個數對i求餘為0則j++,當j的個數和Map中元素個數相等的時候,表明i是Map中每個元素出現的公約數,那麼直接返回ture
if (c.second%i == 0){
j++;
}
if (j == Map.size()){
return true;
}
}
}
return false; #如果遍歷了2到元素出現的最小個數之間所有值,j都不等於deck.size(),表明沒有公約數,則返回false
}
}
};