给你两个正整数 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]