每日一题——LeetCode914
2023-12-25 16:49:16
方法一? 个人解法:
- 因为分组后每组里的数字要是相同的,所以先把有几种数字,每种数字有几张都统计出来用group数组保存,并同时记录最少的张数min。
- 按照要求每组至少要有2张牌,所以可以直接排除最少张数为1的。如果整副牌只有一种数字,并且张数大于等于2,那么就一定是满足的。
- 对于group数组我们只要能找到满足数组里所有张数的一个不为1的公因数m那么就能分成每组有m张牌的n个组,例如对于group=[ 4 , 6 ] ,4和6的公因数为2,那么就能分组成? ? ? ? ? ? ? [ 2,2,2,2,2 ],对于gruop? = [ 5 ,3 ],没有满足的公因数,那么就没有满足的分组
var hasGroupsSizeX = function(deck) {
deck.sort((a,b)=>a-b)
var count=1,group=[],min=999
for(var i=0;i<deck.length;i++){
if(deck[i]===deck[i+1]){
count++
continue
}else{
group.push(count)
if(count<min){
min=count
}
count=1
}
}
if(min<2) return false
if(group.length===1) return true
for(var i=2;i<=min;i++){
var flag=true
for(var item of group){
if(item%i==0) continue
else{
flag=false
break
}
}
if(flag) return true
else continue
}
return false
};
消耗时间和内存情况:
思路是没问题的,但是代码写的有点臃肿复杂,需要优化一下:
var hasGroupsSizeX = function(deck) {
let map = new Map()
for(let n of deck){
if(map.has(n)){
map.set(n,map.get(n)+1)
}else{
map.set(n,1)
}
}
let group = [...map.values()]
let res = group[0]
return group.every(i => (res = gcd(res, i)) > 1)
};
let gcd = (a, b) => (b === 0 ? a : gcd(b, a % b))
其实只需要统计各个数字的频次,求最大公约数是否大于1。
消耗时间和内存情况:
文章来源:https://blog.csdn.net/weixin_52878347/article/details/135200243
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!