題目鏈接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
image.png
這是力扣推送的每日練習(xí)題,難度是簡單,應(yīng)該是團(tuán)隊以前做題的中等水平。
思路:
1、一開始想用異或,但嘗試了很多次之后總是出現(xiàn)大大小小的問題。所以改用一般方法。
2席函、題目沒有明確說是分多少組,比如[1,1,1,1,1,1]冈涧,分成兩組可以茂附,分成三組也可以正蛙。而每組最少得有兩個人,故可以先從每組兩個人開始营曼,用 總?cè)藬?shù)/每組人數(shù) 得出 有多少組乒验,然后遍歷數(shù)組,查每組邊界左右之外的區(qū)域是否存在不相同的值(如[1,1|2,2|3,3|4,4] “|”左右就是邊界附近溶推,而2與2的比較就不是徊件。
容易出錯的地方:
1、當(dāng)每組人數(shù)上升的時候蒜危, 總?cè)藬?shù)/每組人數(shù)不一定能整除虱痕,故要加以判斷,找出能整除的數(shù)再參與運(yùn)算辐赞。
2部翘、由于我們是從人數(shù)升序,組降序開始响委,人數(shù)最低是兩人新思,組最低是一組,所以要特別注意[1,1]這種極限情況赘风,由于我的算法過于垃圾的問題夹囚,一開始[1,1],[1,1,1],[1,1,1,1]的結(jié)果分別為false false true,實際上都是true才對邀窃。
代碼如下:
bool hasGroupsSizeX(vector<int>& deck)
{
int flag;
int group_number,people_number=2;
int n = deck.size();
if (n < 2) return false;
sort(deck.begin(), deck.end());
while (n%people_number!=0)//找到第一個能整除的組
people_number++;
group_number = n / people_number;
while (group_number > 1)
{
flag = 1;
for (int i = 1;i < n;i++)
{
if (deck[i] != deck[i - 1]&& i% people_number != 0)
{
flag = 0;
people_number++;
while (n % people_number != 0)
people_number++;
break;
}
}
if (flag == 1) return true;
group_number = n / people_number;
}
if (group_number == 1) //判斷[1,1]這種情況
{
for (int i = 1;i < n;i++)
if (deck[i] != deck[i - 1])
return false;
return true;
}
return false;
}