算法面试高频题难度35,数学与并查集的结合
题目描述
这是LeetCode上的952。按公因数计算最大组件大小,难度为困难。
Tag:数学、并查集
给定一个由不同正整数的组成的非空数组nums,考虑下面的图:有nums。length个节点,按从nums〔0〕到nums〔nums。length1〕标记;只有当nums〔i〕和nums〔j〕共用一个大于111的公因数时,nums〔i〕和nums〔j〕之间才有一条边。
返回图中最大连通组件的大小。
示例1:
输入:nums〔4,6,15,35〕输出:4
示例2:
输入:nums〔20,50,9,63〕输出:2
示例3:
输入:nums〔2,3,6,7,4,12,21,39〕输出:8
提示:1nums。length21041nums。length2imes1041nums。length21041nums〔i〕1051nums〔i〕1051nums〔i〕105nums中所有值都不同枚举质因数并查集
先考虑如何使用nums进行建图,nums大小为n2104n2imes104n2104,枚举所有点对并通过判断两数之间是否存在边的做法复杂度为O(n2M)O(n2sqrt{M})O(n2M)(其中M1e5M1e5M1e5为nums〔i〕nums〔i〕nums〔i〕的最大值),无须考虑。
而不通过枚举点求公约数的建图方式,可以对nums〔i〕nums〔i〕nums〔i〕进行质因数分解(复杂度为O(nums〔i〕)O(sqrt{nums〔i〕})O(nums〔i〕)),假设其分解出来的质因数集合为SSS,我们可以建立从SkS{k}Sk到nums〔i〕nums〔i〕nums〔i〕的映射关系,若nums〔i〕nums〔i〕nums〔i〕与nums〔j〕nums〔j〕nums〔j〕存在边,则nums〔i〕nums〔i〕nums〔i〕和nums〔j〕nums〔j〕nums〔j〕至少会被同一个质因数所映射。
维护连通块数量可以使用并查集来做,维护映射关系可以使用哈希表来做。
维护映射关系时,使用质因数为key,下标值iii为value(我们使用下标iii作为点编号,而不是使用nums〔i〕nums〔i〕nums〔i〕,是利用nums〔i〕nums〔i〕nums〔i〕各不相同,从而将并查集数组大小从1e51e51e5收窄到21042imes1042104)。
同时在使用并查集维护连通块时,同步维护每个连通块大小sz以及当前最大的连通块大小ans。
Java代码:classSolution{staticintN20010;staticint〔〕pnewint〔N〕,sznewint〔N〕;intans1;intfind(intx){if(p〔x〕!x)p〔x〕find(p〔x〕);returnp〔x〕;}voidunion(inta,intb){if(find(a)find(b))return;sz〔find(a)〕sz〔find(b)〕;p〔find(b)〕p〔find(a)〕;ansMath。max(ans,sz〔find(a)〕);}publicintlargestComponentSize(int〔〕nums){intnnums。length;MapInteger,ListIntegermapnewHashMap();for(inti0;in;i){intcurnums〔i〕;for(intj2;jjcur;j){if(curj0)add(map,j,i);while(curj0)curj;}if(cur1)add(map,cur,i);}for(inti0;in;i){p〔i〕i;sz〔i〕1;}for(intkey:map。keySet()){ListIntegerlistmap。get(key);for(inti1;ilist。size();i)union(list。get(0),list。get(i));}returnans;}voidadd(MapInteger,ListIntegermap,intkey,intval){ListIntegerlistmap。getOrDefault(key,newArrayList());list。add(val);map。put(key,list);}}
TypeScript代码:constN20010constp:number〔〕newArraynumber(N),sznewArraynumber(N)letans0functionfind(x:number):number{if(p〔x〕!x)p〔x〕find(p〔x〕)returnp〔x〕}functionunion(a:number,b:number):void{if(find(a)find(b))returnsz〔find(a)〕sz〔find(b)〕p〔find(b)〕p〔find(a)〕ansMath。max(ans,sz〔find(a)〕)}functionlargestComponentSize(nums:number〔〕):number{constnnums。lengthconstmap:Mapnumber,ArraynumbernewMapnumber,Arraynumber()for(leti0;in;i){letcurnums〔i〕for(letj2;jjcur;j){if(curj0)add(map,j,i)while(curj0)curj}if(cur1)add(map,cur,i)}for(leti0;in;i){p〔i〕i;sz〔i〕1}ans1for(constkeyofmap。keys()){constlistmap。get(key)for(leti1;ilist。length;i)union(list〔0〕,list〔i〕)}returnans};functionadd(map:Mapnumber,Arraynumber,key:number,val:number):void{letlistmap。get(key)if(listnull)listnewArraynumber()list。push(val)map。set(key,list)}时间复杂度:O(nM)O(nsqrt{M})O(nM)空间复杂度:O(n)O(n)O(n)
链接:https:juejin。cnpost7214855127626104869
钙尔奇钙片要吃多长时间钙尔奇钙片有助于长高吗钙尔奇是一种市面上常见的钙片,很多人都服用过,但一般产品都是需要服用一段时间才会有效果,那么我们便要了解一下钙尔奇钙片要吃多长时间?钙尔奇钙片有助于长高吗?钙尔奇钙片要吃多长时……
钙尔奇钙片的副作用钙尔奇钙片的成分是哪些钙尔奇是我们大家都很熟悉的一种补钙产品,很多人都服用过,并且我们大家都知道钙质对我们的身体是非常重要的,那么钙尔奇钙片的副作用?钙尔奇钙片的成分是哪些?钙尔奇钙片的副作用……
广东宏远全员进入休赛期!赵睿胡明轩深夜泡吧,备战杭州亚运会近日,广东男篮全员回到广东境内参与相关活动,以及备战接下来的比赛,由于中国男篮将会在今年6月份举办训练营,并且备战之后的亚运会赛事,因此留给中国男篮成长和培训的时间并不多。……
钙尔奇钙片适用人群钙尔奇钙片多少钱一瓶通常我们大家都知道,钙质对我们的身体是非常重要的,而现在市面上的补钙产品是非常多的,钙尔奇也是其中一种,那么钙尔奇钙片适用人群?钙尔奇钙片多少钱一瓶?钙尔奇钙片适用人群这……
跑步会伤害膝关节吗?注意正确的方法还要补氨糖跑步可以帮助锻炼心肺功能,也能让人精力更加集中,是一项非常好的运动。然而,膝关节是人体重要的关节,在跑步时要承受人体自身体重的好几倍。因此,如果不注意正确的方法的话,跑步是会伤……
如何改善膝关节超伸什么是膝盖超伸有很多人都有膝关节超伸的烦恼,如果是因为后天的运动姿势错误导致的,是可以通过纠正来改善的,可以通过加强臀部肌肉的练习和放松小腿等方法来改善膝关节超伸的现象。如何改善膝关节超伸……
河南8岁男孩穿越时空20天变成了大人,妈妈我带你穿越回去河南80后阳阳妈妈的独白:2022年3月9日,这是会永远刻在我脑海里,永远也无法忘记的一天,因为手术台上,躺着的是我才8岁的儿子阳阳,我无论如何也想不到的是,……
膝关节超伸的危害会导致以下疾病膝关节超伸的危害有很多,长期的膝关节变型可能会导致膝关节疼痛,也会影响到身体其他的部位,导致腰酸背痛等现象,还有可能造成扁平足的现象。膝关节超伸的危害1。膝关节变形导致疼……
健力多氨糖软骨素钙片多少钱健力多氨糖软骨素钙片怎么样健力多是汤臣倍健的一款产品,汤臣倍健非常有名的保健类品牌,具有一定的市场认可度。那么,健力多氨糖软骨素钙片多少钱?怎么样?健力多氨糖软骨素钙片多少钱12940片包装……
这些老年性耳聋的危害,你还不知道吗?这些治疗办法值得一试老年人耳聋相对普遍。随着年龄增长,人体器官逐渐老化,听力也逐步下降。老年性耳聋也称为感音神经性耳聋,这是内耳神经的退行变化。这种改变很难逆转,没有明显的年龄界限。退化过程之间的……
osteocare液体钙好吗补钙小妙招很多人都会有缺钙的问题,有些人选择喝牛奶,吃钙片,喝液体钙,Osteocare这款液体钙在小红书上被很多博主推荐,很多小伙伴们都被种草准备下手试试,但是不知道到底效果怎么样,小……
汤臣倍健液体钙是天然钙吗?钙是人体不可或缺的东西,缺钙会导致很多疾病的发生,下面5号网的小编为你们介绍汤臣倍健液体钙是天然钙吗?汤臣倍健液体钙是天然钙吗天然钙是指以动物或鱼类鳞骨、珍珠壳、贝壳或碳……