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 };

浙公网安备 33010602011771号