本来有想到用找公约数的方法来替代循环求余找到分组的数量,现在仔细一想,其实完全可以直接用求公约数的方法找到正确答案。
解析:
举例数组:[1,1,1,1,2,2,3,3,3,3],1的数量是4,3的数量是4,2的数量是2。划分为四人一组2就不满足要求,但通过求4与2的公约数,可以得出2,划分为两人一组即可满足条件。故可以用计数的方法牺牲空间来提高执行时间。
缺点:
计数的方法在数据间隔很大的时候需要浪费很多空间,如[1,1,10000,10000],如果使用count计数,中间9998位是被浪费掉的。当然效率也会比较高。
排除掉的做法:
本来打算给计数排个序,然后从有数据的位置数起来,遇见0就停止循环,减少运行次数,没想到提交后发现排序后花的时间更多了。
不排序的结果如下:
内存消耗和第一个版本差不多,但是速度是两倍。
理论上第二个解法应该会消耗更多的内存,可能是因为测试数据间隔不大的缘故,所以计数的缺点没有体现出来。
代码如下:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
bool hasGroupsSizeX(vector<int>& deck)
{
int people_number=0;
int count[10000] = {0};
int n = deck.size();
if (n == 1) return false;
for (int i = 0;i < n;i++)
count[deck[i]]++;
for (int i = 0;i < n;i++)
{
if (count[i] > 0)
{
people_number = gcd(people_number, count[i]);
if (people_number == 1)
return false;
}
}
return true;
}