«Это третий день моего участия в первом испытании обновлений 2022 года. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г."
Подсчитайте количество вхождений каждого числа, а затем выясните, есть ли общий делитель между числами.
—— Горячий комментарий Leetcode по этому вопросу
предисловие
Всем привет, меня зовут Йи, и добро пожаловать на мой канал алгоритмов.
Задавайте только интересные алгоритмические вопросы, пишите только алгоритмы для интервью.
Question
914. Группировка карт
Сложность: легко
Дана колода карт, на каждой из которых написано целое число.
На этом этапе вам нужно выбрать число X, которое позволит нам разделить всю колоду на 1 или более групп по следующим правилам:
В каждом наборе есть X карт. На всех карточках в группе написано одно и то же целое число. Возвращает true, только если ваш необязательный X >= 2.
Пример :
输入:[1,2,3,4,4,3,2,1] 输出:true 解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
Solution
пройти через
组内所有的牌上都写着相同的整数
Это предложение нетрудно найти, связана ли успешная группировка с количеством вхождений каждого массива, означает ли это, что количество вхождений каждого числа одинаково?нет
Пока есть общий делитель. Например
1
Есть 2,2
Можно иметь 4.Таким образом, задача превращается в нахождение общих делителей. это математическая задача
Найдите общий делитель Я думаю, что все усвоили его, когда учились в школе.бросание и деление, также известный как алгоритм Евклида, как реализовать его в программе?
Обязательно запомните этот шаблон.
// 辗转相除法
private int gcd (int a, int b) {
return b == 0? a: gcd(b, a % b);
}
Также стоит изучить метод подсчета в коде, использовать для подсчета масштаб массива гораздо проще, чем использовать Карту.
короче этот вопросотступить.
Code
/**
* @author 一条coding
*/
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
// 计数
int[] counter = new int[10000];
for (int num: deck) {
counter[num]++;
}
// 求gcd
int x = 0;
for(int cnt: counter) {
if (cnt > 0) {
x = gcd(x, cnt);
if (x == 1) {
return false;
}
}
}
return x >= 2;
}
// 辗转相除法
private int gcd (int a, int b) {
return b == 0? a: gcd(b, a % b);
}
}
Наконец
Вроде, вроде, и TMD нравится!