【leetcode】 n 的第 k 个因子

题目:
给你两个正整数 n 和 k 。如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。
原题链接

思路:

  • 思路1
    • 暴力遍历,使用for循环对于range(1,n+1),逐个遍历,如果符合要求【当前i值是正整数n的因子】就加到列表alist中,得到的结果自然是升序,得到所有n的因子后,利用列表索引k-1返回n的第k个因子。还要注意返回-1的情况,得到所有n的因子列表alist后,用if语句判断,如果k>len(alist),return -1。
    • 空间复杂度:O(n),创建了数组alist存放n的所有因子。时间复杂度:O(n)
    • 缺点:我们只需要得到第k小的因子,比k大或小的因子无需关心,所以我们不必得到所有n的因子,也无需用列表alist来记录所有的因子。
  • 思路2
    • 基于思路1的改进,创建count变量,用于记录此时的因子是第count小,一旦count==k,直接return 此时的因子,函数终止运行。并且,无需再用if语句判断k和len(alist)的关系,如果for循环遍历完,count始终不等于k,即证明n 的因子数少于 k,return -1。
    • 空间复杂度度:O(1)。时间复杂度:O(n),但时间是还是优化了的。
  • 思路3
    • n的因子是成对出现的,一半因子大于sqrt(n),一半因子小于sqrt(n)。

代码及运行效果:

思路1代码

class Solution:
    def kthFactor(self, n: int, k: int) -> int:
        alist=[]
        for i in range(1,n+1):
            if n%i==0:
                alist.append(i)
        if k>len(alist):
            return -1
        return alist[k-1]

思路1运行效果
【leetcode】 n 的第 k 个因子_第1张图片

思路2代码

class Solution:
    def kthFactor(self, n: int, k: int) -> int:
        count=0
        for i in range(1,n+1):
            if n%i==0:
                count+=1
            if count==k:
                return i
        return -1

思路2运行效果
【leetcode】 n 的第 k 个因子_第2张图片
思路3代码

class Solution:
    def kthFactor(self, n: int, k: int) -> int:
        count=0
        for i in range(1,int(n**(1/2)+1)):
            if n%i==0:
                count+=1
            if count==k:
                return i
        #运行到这里,证明第k小的因子大于n**(1/2),此时i值为小于n**(1/2)的 最大因子。
        if i**2==n:i-=1#如果此时因子i刚好等于n**(1/2),需要执行i-1
        while i>0:
            if n%i==0:
                count+=1
            if count==k:
                return n//i#//得到int型
            i-=1
        return -1
        

思路3运行效果
【leetcode】 n 的第 k 个因子_第3张图片

你可能感兴趣的:(Python学习)