LeetCode-Python-5433. n 的第 k 个因子(数组 + 因数)

本文介绍了一种寻找正整数n的第k个因子的高效算法,通过仅遍历n的平方根范围内的数,实现了O(logN)的时间复杂度。文章详细解析了算法思路,并提供了具体示例,帮助读者理解如何在不完整遍历所有因子的情况下找到目标因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你两个正整数 n 和 k 。

如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。

考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。

 

示例 1:

输入:n = 12, k = 3
输出:3
解释:因子列表包括 [1, 2, 3, 4, 6, 12],第 3 个因子是 3 。

示例 2:

输入:n = 7, k = 2
输出:7
解释:因子列表包括 [1, 7] ,第 2 个因子是 7 。

示例 3:

输入:n = 4, k = 4
输出:-1
解释:因子列表包括 [1, 2, 4] ,只有 3 个因子,所以我们应该返回 -1 。

示例 4:

输入:n = 1, k = 1
输出:1
解释:因子列表包括 [1] ,第 1 个因子为 1 。

示例 5:

输入:n = 1000, k = 3
输出:4
解释:因子列表包括 [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500, 1000] 。

 

提示:

  • 1 <= k <= n <= 1000

思路:

先用循环把前一半的因数找出来,可以保证是严格升序,然后判断总因数个数来决定有没有解。

接着如果只需要在前一半因数找结果,就直接返回。

否则,找到目标值对应的另一个因数,返回 n // 这个因数。

举例,对于输入n = 12, k = 4,

可以用循环找出有序因数数组: [1, 2, 3],

现在已知前三个因数,而且因为知道 n = 12 不是完全平方数,所以也知道总共有六个因数。

如果希望找第四个因数,也就是倒数第三个因数,可以用 n // 正数第三个因数来得到。

时间复杂度:O(logN)

空间复杂度:O(logN)

class Solution(object):
    def kthFactor(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: int
        """
        l = []
        for i in range(1, int(n ** 0.5) + 1):
            if n % i == 0:
                l.append(i)
        total = len(l) * 2 if l[-1] ** 2 != n else len(l) * 2 - 1
        if total < k: # 无解
            return -1
        
        if k - 1 < len(l): # 如果可以在前一半里找
            return l[k - 1]
        else:
            idx = (len(l) - 1) * 2 - k # idx 是目标值对应的另一个因数的下标
            return n // l[idx] if total % 2 else n // l[idx + 2]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值