题解 | #能被多个质数整除的第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]
全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务