题解 | #能被多个质数整除的第K长子段#
能被多个质数整除的第K长子段
http://www.nowcoder.com/practice/162f79e68d6c4b9988a994344181d366
注意到,如果对于给定的区间左边界l,若满足题目条件的区间右边界最大为r,那么显然(l,r)的任意子区间也是满足条件的,也即固定区间左边界为(l,r)中任取的i,区间右边界至少为r。因此不需要记录每一个满足条件的区间对(i,j)再进行排序,而只需要对于左边界l从0到n-1遍历,查找并记录满足条件的最大区间长度,最后对这n个数做逆序排序输出第K个大长度即可。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求满足条件的第K大长度
# @param A int整型一维数组 牛牛的数组A
# @param X int整型 至少要存在X个不同的质数
# @param K int整型 牛牛希望找到第K大的长度
# @return int整型
#
primes=[]
factors=[]
class Solution:
def getprimes(self,n):
if n<2:
return
primes.append(2)
i=3
while i<=n:
flag=True
for p in primes:
if i%p==0:
flag=False
break
if flag:
primes.append(i)
i+=2
return
def getfactors(self,a):
fac=[]
for p in primes:
if p>a:
break
if a%p==0:
fac.append(p)
return fac
def GetKthLength(self , A , X , K ):
# write code here
n=max(A)
self.getprimes(n)
A_facs=[]
for a in A:
A_facs.append(self.getfactors(a))
l=len(A)
ints=[]
for i in range(l):
if len(A_facs[i])<X:
ints.append(0)
continue
commonfac=A_facs[i]
j=i+1
while j<l:
cnt=0
for p in commonfac:
if p in A_facs[j]:
cnt+=1
if cnt<X:
break
j+=1
ints.append(j-i)
if len(ints)<K:
return -1
else:
ints.sort(reverse=True)
return ints[K-1]