【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运行效果
在这里插入图片描述

思路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运行效果
在这里插入图片描述
思路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运行效果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值