本文主要是介绍跟LintCode的算法题杠上了(1728卡牌分组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
1 <= deck.length <= 10000
0 <= deck[i] < 10000
示例1
输入: [1,2,3,4,4,3,2,1]
输出: true
解释: 可行的分组 [1,1],[2,2],[3,3],[4,4]
输入: [1,1,1,2,2,2,3,3]
输出: false
解释: 没有可行的分组
输入: [1]
输出: false
解释: 没有可行的分组
输入: [1,1,2,2,2,2]
输出: true
解释: 可行的分组 [1,1],[2,2],[2,2]
思路
利用map 可以进行数字归类,相同的数字出现的个数进行 + 1,然后如果数组只有1个就直接返回false,如果超过2的长度,就进行相邻2个数字的绝对值,如果 > 0 就说明2组数字的个数不相同,返回false
public static boolean hasGroupsSizeX(List<Integer> deck) {if(deck.size() == 1){return false;}else{Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < deck.size(); i ++){int index = 1;if(map.containsKey(deck.get(i))){map.put(deck.get(i),map.get(deck.get(i)) + 1);}else{map.put(deck.get(i),index);}}int arr [] = new int[map.size()];int index = 0;for (Integer key : map.keySet()) {Integer value = map.get(key);arr[index] = value;index ++;}//每个组的个数必须相同,个数必须 >= 2for(int i = 0; i < arr.length - 1; i ++){if(arr.length == 2){if(arr[0] % arr[1] == 0 || arr[1] % arr[0] == 0){return true;}}else{if(Math.abs(arr[i] - arr[i + 1]) > 0){return false;}}}return true;}}
这篇关于跟LintCode的算法题杠上了(1728卡牌分组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!