题目:
给你两个正整数 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运行效果