1492. The kth Factor of n

仅供自己学习

 

思路:

直接暴力可以解决,但时间复杂度为O(n)

通过另一种方法,

设 m为n的因子,n=m*(n/m),我们假设 :至少存在一个因子使得 其小于根号n,

反证:我们设想 m 和 n/m都大于 根号n

n=m*(n/m)> 根号n*根号n=n,与我们设想矛盾,如果正确应该大于n而不是等于n。所以满足至少存在一个因子是的其小于根号n,

那么我们就可以将时间复杂度降低为O(根号n),因为只要有m,我们就有了 n/m,

我们用一个计数count来判断是否为第k个,然后第一次循环范围为【1,根号n】,能得到m,第二次循环范围为【根号n,1】,

为什么这么做,因为我们两个循环共用同一个count,第一个循环结束count结果不动,继续用在第二个循环。如果第一个循环count不等于K,那么就到第二个循环继续计数,如果在第二个循环count=K,那么我们返回 n/m 而不是第一个循环返回的m,那么我们就可以尽可能的减少后面不必要的判断了。

 

代码:

 1 class Solution {
 2 public:
 3     int kthFactor(int n, int k) {
 4         int count=0;
 5         int factor=1;
 6         for(;factor*factor<=n;++factor){
 7             if(n%factor==0) count++;
 8             if(count == k) return factor;
 9         }
10         --factor;
11         if(factor*factor==n) --factor;
12         for(;factor>0;--factor){
13             if(n%factor==0) count++;
14             if(count == k) return n/factor;
15         }
16         return -1;
17     }
18 };

 

posted @ 2021-03-23 16:56  Mrsdwang  阅读(29)  评论(0)    收藏  举报