标签:arr return LeetCode1806 self perm ks 步数 append 置换群
题意:题目的意思是,给定一个初始状态perm,然后对perm的每个元素按照上述的规则进行变换操作。问:perm经过多少次这种操作能够变回初始的perm。
解题思路:第一种方法就是模拟,一直变换,直到变成原来的样子。
第二种解法:置换群与不相交循环,如图
code:
#解法1: class Solution(object): def check(self,n): for i in range(n): if self.perm[i]==self.arr[i]: continue else: return False return True def reinitializePermutation(self, n): self.perm = [] for i in range(n): self.perm.append(i) step = 0 self.arr = [0]*n tmp = self.perm[:] while self.check(n) is False: step+=1 for i in range(n): if i %2 ==1: self.arr[i] = tmp[n // 2 + (i - 1) // 2] else: self.arr[i] =tmp[i//2] tmp = self.arr[:] return step # #解法2: class Solution(object): def dfs(self,i,n): if self.vis[i] ==1: return 0 else: self.vis[i]=1 return 1+self.dfs(self.arr[i],n) def gcd(self,a,b): if a%b== 0: return b else: return self.gcd(b,a%b) def reinitializePermutation(self, n): self.perm = [] for i in range(n): self.perm.append(i) self.arr= [] for i in range(n): if i %2 ==1: self.arr.append( self.perm[n // 2 + (i - 1) // 2]) else: self.arr.append( self.perm[i//2]) self.vis= [0]*n ks = [1] for i in range(n): if self.arr[i]!=self.perm[i] and self.vis[i]==0: x = self.dfs(i,n) ks.append(x) while len(ks)>1: a=ks.pop() b = ks.pop() lcm = a*b//self.gcd(a,b) ks.append(lcm) return ks[0]
标签:arr,return,LeetCode1806,self,perm,ks,步数,append,置换群 来源: https://www.cnblogs.com/ISGuXing/p/14588961.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。